sábado, 17 de enero de 2009

Enlazar un AS/400 desde Microsoft SQL Server

Linking an AS/400 from Microsoft SQL Server... Click here for an english version.

Como todos ustedes mis amados lectores ya saben, soy un apasionado por la tecnologia informatica, en mi empleo actual me desempeño como administrador de bases de datos, bajo mi cuidado tengo un AS/400, un SQL Server y uso Cognos para la elaboracion de reportes. Como ya todo mundo sabe, este no es un blog dedicado a la tecnologia informatica, sino a golpear duro conciencias pero en fin, este tambien es un modo de golpearlas: Asi es, ayudo a mis colegas administradores de bases de datos y comparto conocimiento, el cual no es propiedad exclusiva de nadie, aunque haya costado trabajo aprender lo que uno sabe.

Si quieres crear un servidor enlazado con AS/400, primero debes instalarle a tu SQL el proveedor de OLEDB para DB2, en el siguiente link puedes bajarlo completamente gratis
Si antes quieres verificar que tu server no tiene instalado el proveedor de DB2, abre el Management Studio y navega hasta Server Objects\Linked Servers\Providers, si esta instalado, veras en la lista de proveedores uno que se llama DB2OLEDB, si estan ordenados alfabeticamente, sera el segundo o tercero.
Despues create una cuenta en AS/400 para tu linked server, este actua como un cliente mas del AS/400, procura darle a la cuenta solamente los acceso que necesites, no le des acceso abierto a todo lo que haya en la base de datos.
Una vez que tengas instalado el proveedor ole db para DB2 y una cuenta en el AS/400 para usarla con tu linked server, regresate al management studio, ahi mismo, Presiona CTRL+N y pega el siguiente comando:

EXEC master.dbo.sp_addlinkedserver @server = N'<...>', @srvproduct=N'DB2OLEDB', @provider=N'DB2OLEDB', @datasrc=N'<...>', @provstr=N'Provider=DB2OLEDB;Password=<...>;Persist Security Info=True;User ID=<...>;Initial Catalog=<...>;Network Address=<...>;Package Collection=<...>', @catalog=N'<...>'

En el comando los vas a sustituir los <...> por esta informacion:
@server= Es el nombre "interno" para identificar al linked server de otros que tengas.
@datasrc= Es el host name de tu AS/400
@catalog= Es la base de datos del AS/400 a la que quieres conectarte. Si no sabes que base de datos debes conectarte, preguntale al DBA del AS/400 o revisalo con el comando WRKRDBDIRE tipicamente, la entrada que tenga el valor *LOCAL en la columna que dice remote location, esa es la base de datos que vas a especificar aqui... ¡Debes tener mucho cuidado en como usas este comando porque podrias mandar al carajo el AS/400 y no culpo a su administrador si despues quiere matarte! mas bien lo culparia por dejar esos comandos a libre disposicion, eso si... en pocas palabras, ¡puedes ver pero no toques nada!.
Password= La contraseña de la cuenta que creaste en AS/400 para tu linked server
User ID= El usuario de la cuenta que creaste en AS/400 para tu linked server
Initial Catalog=La base de datos del AS/400 (otra vez)
Network Address= La direccion IP de tu AS/400
Package Collection=Es el equivalente a un esquema de SQL Server, tienes que referenciar el package a donde pertenecen las tablas que desees utilizar con tu linked server. Si no sabes en que package collection estan, conectado al AS/400 lo puedes averiguar, utilizando el siguiente comando: WRKOBJ tomas el dato que viene en la columna que dice Library

Con eso es mas que suficiente para resolver ese tipo de problemas, espero que sea de utilidad para ustedes!

12 comentarios:

  1. Hola! Gracias por compartir tus conocimientos con el mundo.

    Un pregunta, necesito hacer el link al AS400 pero no al DB2, estoy usando las bases de bibliotecas (que la verdad no se como se llamen) de las que hago los querys como "biblioteca.tabla". Logré hacerlo con el driver de ODBC y cree un DSN con el driver de data access de IBM, pero cuando traigo datos DBTYPE_TIMESTAMP (que en realidad son fechas pero que tienen default '0001-01-01' al insertar en MSSQL 2005 truena porque el tipo al que lo mapea es 'datetime' y soporta fechas de 1753-01-01 en adelante, el tipo de dato date ya está en mssql 2008, pero la aplicación que estoy "arreglando" fue diseñada en 2005...

    alguna sugerencia o idea que me sugieras amigo???

    Gracias de ante mano por tu atención.

    P.D. Yo te puedo ayudar con dudas de Linux entre otras cosas, ya sabes, una por otra =)
    http://www.corporativolinux.com.mx

    Saludos.

    ResponderBorrar
  2. Hola! Gracias por compartir tus conocimientos con el mundo.

    Un pregunta, necesito hacer el link al AS400 pero no al DB2, estoy usando las bases de bibliotecas (que la verdad no se como se llamen) de las que hago los querys como "biblioteca.tabla". Logré hacerlo con el driver de ODBC y cree un DSN con el driver de data access de IBM, pero cuando traigo datos DBTYPE_TIMESTAMP (que en realidad son fechas pero que tienen default '0001-01-01' al insertar en MSSQL 2005 truena porque el tipo al que lo mapea es 'datetime' y soporta fechas de 1753-01-01 en adelante, el tipo de dato date ya está en mssql 2008, pero la aplicación que estoy "arreglando" fue diseñada en 2005...

    alguna sugerencia o idea que me sugieras amigo???

    Gracias de ante mano por tu atención.

    P.D. Yo te puedo ayudar con dudas de Linux entre otras cosas, ya sabes, una por otra =)
    http://www.corporativolinux.com.mx

    Saludos.

    ResponderBorrar
  3. Espero haber entendido correctamente tu pregunta.

    Segun deduzco de tus comentarios me parece que ya lograste conectar el SQL y el AS/400 pero cuando quieres correr un query en un archivo fisico (asi se llaman esas tablas que dices tu que son "biblioteca.tabla") donde aparece un campo timestamp entonces falla ¿cierto?
    Algo que me ha funcionado en SQL 2005 cuando me encuentro con algo asi es esto, pruebalo y me cuentas como te fue.

    USE BASESQL

    INSERT INTO TABLESQL
    SELECT * FROM OPENQUERY(MI_AS400,'SELECT CHAR(campo_fecha) AS campo_fecha,campo1,campo2,campoN from libl.archivo_fisico')

    GO


    La funcion CHAR de AS/400 devuelve una representacion alfanumerica de una fecha, aqui puedes ver mas informacion:
    http://publib.boulder.ibm.com/iseries/v5r1/ic2924/info/q400/rbaf9mst82.htm#HDRCHAR

    ResponderBorrar
  4. Hola, mi nombre es Jennifer acerca del Linked Server, ya he hecho las conexiones en sql server 2005 pero cuando intente hacer e mismo proceso para sql server 2008 al parecer no hay compatibilidad, me podrías colaborar con ese tema, mi email es lunaticajenny7@hotmail.com ojala me puedas ayudar ya que es de suma urgencia está conexión con el AS/400 desde sql server 2008.

    Gracias!!!

    ResponderBorrar
  5. ESTOY SIGUIENDO TUS PASOS SOY NUEVO EN EL AS400 CUANDO CREO EL SERVIDOR VINCULADO DE LA SGTE MANERA:

    EXEC master.dbo.sp_addlinkedserver
    @server = N'PRUEBA',
    @srvproduct=N'DB2OLEDB', @provider=N'DB2OLEDB',
    @datasrc=N'LOOPBACK',
    @provstr=N'Provider=DB2OLEDB;Password=OPERADOR;Persist Security Info=True;
    User ID=OPERADOR;Initial Catalog=Name_BD;Network Address=xxx.xx.xx.xxx(IP);Package Collection=QSYS',
    @catalog=N'Name_BD'

    PERO CUANDO CREO LA SGTE CONSULTA:

    SELECT * from OpenQuery(PRUEBA,'Select * from SIGALIB.ALU')

    SALE EL SGTE ERROR:

    El proveedor OLE DB "DB2OLEDB" del servidor vinculado "PRUEBA" devolvió el mensaje "".
    Mens. 7303, Nivel 16, Estado 1, Línea 2
    No se puede inicializar el objeto de origen de datos del proveedor OLE DB "DB2OLEDB" para el servidor vinculado "PRUEBA".



    ME PODRIAS AYUDAR POR FAVOR

    TU SABES MAS DE ESTO AGREDECERIA MUCHO TU AYUDA

    ResponderBorrar
  6. Mi querido Juan Cix
    Yo veo aqui dos cosas: Al postear el comando con el cual creaste el linked server parece que no incluiste el nombre de usuario sino solamente el password, lo cual creo que es comprensible para evitar problemas de seguridad futuros ya que publicar eso aqui es riesgoso sin embargo de todos modos te sugiero checar que tengas correctos todos los parametros necesarios: direccion de IP, user Id y password de AS/400, nombre del catalogo inicial, etc.
    Y otra cosa.... verifica que tu SQL server tenga instalado el proveedor de OLEDB para AS/400 (El link esta en el mismo articulo que leiste) ademas de que tambien la cuenta que estas usando para conectar los servidores tenga permisos al catalogo y demas objetos de AS/400 que necesites acceder desde SQL Server.

    ResponderBorrar
  7. Hola, pero creo que debes de decir que no instalen Sql Server Standard ya que con la estandar no hay controlador DB2OLEDB.
    Saludos. (Mhalonso)

    ResponderBorrar
  8. Hola mi nombre es Manuel y he seguido sus pasos pero me salta el error:
    One or more arguments were reported invalid by the provider.
    Cannot initilize the data source object of OLE DB provider "DB2OLEDB" for linked server "DB2".

    Este es el codigo que introduzco.

    EXEC master.dbo.sp_addlinkedserver
    @server = N'DB2',
    @srvproduct=N'DB2OLEDB',
    @provider=N'DB2OLEDB',
    @datasrc=N'ASDATA',
    @provstr=N'Provider=DB2OLEDB;
    Password=XXXXX;
    Persist Security Info=True;
    User ID=USUARIO;
    Initial Catalog=ASDATA;
    Network Address=xxx.xxx.xx..;
    Package Collection=QSYS',
    @catalog=N'ASDATA'

    Es correcto que el Catalogo y el data source se llamen igual, porque he seguido exactamente los pasos y en mi As400 son iguales. Me falta algo.. por favor estoy desesperado.
    Mil gracias.

    ResponderBorrar
  9. Hola, a mi me sale este mensaje.. alguien sabe porque? Cannot fetch a row from OLE DB provider "sql" for linked server "(null)" . (Microsoft SQL server 7330).
    Tengo privilegios sobre el AS400.. Por favor, ayuda....

    ResponderBorrar
  10. Manolo, al parecer tienes mal el string de conexion del parametro @provstr=N'...', prueba con este ejemplo de abajo (cambia los puntos suspensivos por los valores aplicables a tu red)

    Fijate en este ejemplo, adaptalo a tus necesidades y me cuentas como te fue:

    Provider=DB2OLEDB;Password=mipassword;Persist Security Info=True;User ID=miuserid;Initial Catalog=micatalog;Network Address=;Package Collection=algunpackagecollection

    ResponderBorrar
  11. Y otra cosa... si tienen problemas al crear su linked server y esos son relacionados con algo en su infraestructura yo no los puedo ayudar desde aqui.

    ResponderBorrar
  12. Hola que tal, he seguido este blog sobre el AS400, ya tengo la conexiòn puedo realizae selects pero al realizar un update envia este mensaje- Cannot execute the query "UPDATE BD.MEX.AB2344 set CAMPO1 = '01/01/01' WHERE CAMPO2=(70382.)" against OLE DB provider "IBMDASQL" for linked server "AS400".

    Ojala pueda ayudarme. gracias

    ResponderBorrar