Loading…

Criando um Linked Server do SQL Server para o DB2 AS/400

Fala Pessoal,

Na empresa que trabalho possuo um ambiente SQL Server e um ambiente com um Mainframe AS/400 da IBM com o SGBD DB2 instalado. Com isso, constantemente precisamos acessar os dados do servidor AS/400 de dentro do SQL Server e fazemos isso via Linked Server.

Para utilizarmos um provider OLE DB no nosso linked server, deve ser instalado o IBM Client Acess no servidor. Após essa instalação é disponibilizado o provider “IBM DB2 UDB for iSeries IBMDA400 OLE DB Provider”.

Segue abaixo o script de criação do LS:

exec sp_addlinkedserver @server=N’NOME_LINKED_SERVER’,
@srvproduct=N’IBM DB2 UDB for iSeries IBMDA400 OLE DB Provider’,
@provider=N’IBMDA400′,
@datasrc=N’X.X.X.X’, — IP do servidor
@catalog=’CATALOG_SERVIDOR’,
@provstr=’Default Collection=NOME_LIBRARY’

exec        sp_addlinkedsrvlogin @rmtsrvname=N’NOME_LINKED_SERVER’,
@useself=’false’,
@rmtuser=N’USER’,
@rmtpassword=’SENHA’

Em seguida devem ser habilitadas algumas opções do PROVIDER e do Linked Server para permitir a execução de Updates, querys com like dentre outros operações.

USE [master] GO
EXEC master.dbo.sp_MSset_oledb_prop N’IBMDA400′, N’AllowInProcess’, 1
GO
EXEC master.dbo.sp_MSset_oledb_prop N’IBMDA400′, N’NonTransactedUpdates’, 1
GO
EXEC master.dbo.sp_MSset_oledb_prop N’IBMDA400′, N’SqlServerLIKE’, 1
GO
EXEC master.dbo.sp_serveroption @server=N’NOME_LINKED_SERVER’, @optname=N’collation compatible’, @optvalue=N’true’
GO
EXEC master.dbo.sp_serveroption @server=N’NOME_LINKED_SERVER’, @optname=N’rpc’, @optvalue=N’true’
GO
EXEC master.dbo.sp_serveroption @server=N’NOME_LINKED_SERVER’, @optname=N’rpc out’, @optvalue=N’true’
GO

Com o linked server criado, as seguintes operações podem ser realizadas do SQL Server:

Select * From OpenQuery(NOME_LINKED_SERVER,’Select* FROM LIBRARY.TABLE
FETCH FIRST 1 ROWS ONLY
FOR READ ONLY ‘ ) As Remote

exec (‘Select * FROM LIBRARY.TABLE
FETCH FIRST 1 ROWS ONLY
FOR READ ONLY ‘) AT NOME_LINKED_SERVER

SELECT * FROM NOME_LINKED_SERVER.CATALOG.LIBRARY.TABLE

Para chamar uma procedure do DB2 , deve ser utilizado a seguinte sintaxe:
exec (‘call LIBRARY.NOME_PROCEDURE(?,?)’,1,’Fabricio Lima’) AT NOME_LINKED_SERVER

Essa procedure recebe 1 parametro do tipo INT e um parâmetro VARCHAR.

Podemos também inserir e alterar valores via linked server.
INSERT INTO NOME_LINKED_SERVER.CATALOG.LIBRARY.TABLE(Column)
SELECT VALUE

UPDATE NOME_LINKED_SERVER.CATALOG.LIBRARY.TABLE
SET Column = ‘TESTE’
WHERE Column <> ‘TESTE

Infelizmente, no DB2 para o AS/400 não é possível realizar um simples UPDATE com JOIN como o que temos abaixo, deve ser utilizado EXISTS para isso.

UPDATE A
SET A.Column = B.Column
FROM TABLE A
JOIN TABLE B ON A.Cod = B.Cod

Entretanto, via Linked Server do SQL Server esse update funciona perfeitamente.

UPDATE A
SET A.Column = B.Column
FROM NOME_LINKED_SERVER.CATALOG.LIBRARY.TABLE A
JOIN NOME_LINKED_SERVER.CATALOG.LIBRARY.TABLE B ON A.Cod = B.Cod

Encontrar esse tipo de material é bem difícil, se eu encontrasse um post como esse quando comecei a trabalhar com o AS/400 através do SQL Server eu teria adiantado bastante meu trabalho. Então, espero que agora outras pessoas possam encontrar esse post mais facilmente.

Gostou desse Post?

Cadastre seu e-mail para receber novos Posts e curta minha Página no Facebook para receber Dicas de Leituras e Eventos sobre SQL Server.

Abraços,

Fabrício Lima

MCITP – Database Administrator

Consultor e Instrutor SQL Server

Trabalha com SQL Server desde 2006

12 thoughts on “Criando um Linked Server do SQL Server para o DB2 AS/400

  1. Opá! Fabricio tudo bem?

    Cara, muito boa a ideia do artigo. Compartilho do mesmo sentimento quando a artigos e material na internet sobre DB2 e Linked Server SQL Server…. tem muito pouco!.

    Trabalho em um ambiente onde temos alguns Mainframe DB2 for z/OS.! E existe algumas diferenças entre driver OLEDB para o SO do Mainframe AS/400 e o z/OS!

    * Usamos o DB2 Connect Enterprise Edition onde apos a sua instalação preciamos aplicar a licensa de uso e depois configurar o linked Server.
    * Também usamos para conexao Likend Server com o DB2 o Microsoft Host Integration Server que é uma parte do Microsoft BizTalk.!
    * Também temos uma integração “InfoSphere Federation Server” o qual utilizamos para acessar VSAM, DB2 Linux, DB2 zOS ou até mesmo o proprio SQL Server.

    Para cada um tem uma forma e um driver diferente para acesso.

    Muito bom o artigo, pois não conhecia a acesso ao DB2 for AS/400.

    []´s

    Leivio

    1. Valeu Leivio.

      Material de AS/400 é bem raro. Muita coisa do DB2 não funciona nessa plataforma. Nosso AS/400 já possui uns 7 anos e estamos em processo de mudança. Ainda não decidimos se vamos continuar com o DB2 ou se vamos migrar para o SQL Server e deixar todos os ambientes da empresa com o mesmo SGBD.

      Abraço!!!

  2. Olá Fábricio, na verdade no DB2/400 é possivel fazer um update mas de uma maneira um pouco indireta, por exemplo:

    update VENDAS/CADCLI set NOMCLI=’ALFA’
    WHERE CADCLI.codcli IN (
    SELECT CADCLI.codcli
    FROM VENDAS/CPMCADCLI, VENDAS/CADCLI WHERE
    CADCLI.codcli=CPMCADCLI.codcli AND CADCLI.codcli=2069)

    No exemplo esta forçando update na biblioteca VENDAS arquivo cadastro de cliente CADCLI.
    Tendo que existir previamente no arquivo complemento CPMCADCLI biblioteca VENDAS também.

    Na verdade vim até este blog pesquisando na internet sobre performance do SQL Server, li bastante coisa interessante, pois sou muito leigo ainda com SQL Server, então me deparei com este interessante artigo sobre conexão AS/400. Por sinal, um ambiente com qual eu trabalho a mais de 10 anos.

    1. Olá Luciano.

      Obrigado pelo comentário. No DB2/400 é possível fazer update sim… Eu utilizava um exists para isso.
      Eu não consigo fazer um update simples com join, certo? Como no exemplo abaixo:
      update a
      set A.nome = ‘sss’
      from tab A
      join tab B on a.cod = b.cod

      Acabamos de migrar esse ambiente AS/400 para um SQL Server 2008 R2.

      Abraços

  3. Boa tarde.
    Eu efetuei o procedimento que você passou, mas agora estou tendo a seguinte mensagem de retorno: OLE DB provider ‘IBMDA400’ cannot be used for distributed queries because the provider is configured to run in single-threaded apartment mode.

    Meu servidor é 64Bits, se puder me ajudar agradeço.

  4. Boas,

    Antes de mais obrigado pelo post, muito bom…

    Tenho um problema, consigo fazer o Select, mas quando tento fazer Insert da-me um erro “OLE DB provider “IBMDA400” for linked server “NEW_LINKED_SERVER” returned message “CPF4328: O membro SICSMS não foi registado no diário *N.
    “.”

    O que devo fazer?

    Obrigado,

    Telmo

  5. Boas,

    Obrigado pelo post.

    Consigo fazer select, mas o insert n funciona.

    “OLE DB provider “IBMDA400” for linked server “NEW_LINKED_SERVER” returned message “CPF4328: O membro SICSMS não foi registado no diário *N.

    Obrigado

  6. Bom dia Fabricio,
    Como foi a migração? Tudo procedeu bem? Você migraram totalmente o banco ou estão em cenário de convivência entre as duas plataformas?

    Obrigado

Deixe uma resposta