Conectar a una BD mysql desde SQL SERVER con servidores vinculados

Escenario :


Tengo un servidor principal con SQL Server como manejador de base de datos. Adicionalmente, tengo un servidor Linux (con redhat) con un sistema en php que conecta a una base de datos MySQL  instalada en dicho terminal.  El problema : Necesito pasar información de SQL a Mysql de 2 a 4 veces por día.  ¿Como hago para pasar toda la información y que se mantenga en la capa de Datos ?. Después de varios días de investigación y de haber encontrado 3 posibles soluciones sin salir de la capa de datos ( freetds era una muy buena opción, ejecuciones con procesos en segundo plano bajo en cron de linux) , he optado por solucionar el problema con lo que me parece la manera mas elegante y certera. servidores vinculados.

¿Qué es un servidor vinculado?

Su nombre lo dice todo, agrego una BD externa al SQL y la hago accesible, con esto puedo hacer todo tipo de consultas tipo transac sql. 

EMPEZAMOS

1. Instala los driver que te permite manejar la base Mysql.  Entonces bajar el conector  ODBC para mysql

http://dev.mysql.com/downloads/connector/odbc/


2. Luego de instalarlo debemos configurarlo, creamos el odbc y lo configuramos:

Yo tengo el sql server 2005 :

Entra al "Panel de Control" y busca "Herramientas Administrativas". Entra en este y aparecerá "Orígenes de datosODBC".

Se abrirá la siguiente ventana. Busca el botón "Agregar".




Clic sobre Mysql ODBC 3.51 driver (que es lo que instalaste en el paso 1). Luego sobre finalizar.


Se abre el conector ODBC del MySQL. En este debes definir los parámetros de conexión a tu base de datos MySQL. Simplemente agrega el nombre de tu servidor, tu user y password. No olvides colocar el nombre de la conexión (DataSource Name). Lo vamos a usar en el Paso 3. Sugiero "MySQL_LINK".



3. Vincular Mysql con SQL Server 2005

En el  administrador corporativo del SQL Server 2005  buscas la opción "Objetos del servidor". Dentro existe una subcarpeta llamada "Servidores vinculados".

 

clic derecho sobre Servidores vinculados y buscamos la opción "Nuevo servidor vinculado".

 

Se abre la ventana "Nuevo servidor vinculado" y colocas los parámetros para conectarse con la base MySQL.

Marcas la opción "Otro origen de datos" . Debes colocar los siguientes parámetros.

Servidor vinculado : LINKED_MYSQL (coloca el nombre que desees)

Proveedor : Microsoft OLE DB Provider for ODBC Drivers.

Nombre del Producto : MySQL

Origen de datos : MySQL_LINK (Ojo: Este es el nombre del ODBC que creaste en el paso 2, colocale el que tu hayas colocado.)

Cadena de proveedor : ODBC:DSN=MySQL_LINK::Table=aaa (el valor aaa es una tabla de la base MySQL, coloca cualquiera de las tablas de tu base. DSN es el nombre del ODBC que creaste en el paso 2)

Catálogo : pyp1 (nombre de la base de datos a la cuál quieras conectarte)



Dentro de la misma ventana, clic en la ficha "Seguridad" para que establecer con que user y password nos vamos a conectar. Clic en "Se establecerán usando este contexto de seguridad" y colocamos el user y password. Luego clicen el botón "Aceptar". Eso es todo, ya tenemos vinculado nuestro servidor MySQL con SQL 2005.

 

4. Hacer  consultas SQL en el servidor vinculado.

Ubicación : En el servidor central donde esta la base SQL Server 2005

Vayamos a probar si podemos hacer consultas en MySQL.

Ejecutamos exec sp_Tables_Ex 'LINKED_MYSQL' (Devolvemos información acerca de las tablas de el servidor que hemos vinculado.LINKED_MYSQL es el nombre del servidor vinculado que hemos creado). Se deben mostrar las tablas del servidor vinculado.


 


Veamos algunos ejemplos de sentencias SQL con openquery.

¿Si quiero mostrar datos de las tablas?

select * from openquery (LINKED_MYSQL,'select * from aaa')

¿Si quiere eliminar los datos de un tabla?

Delete openquery (LINKED_MYSQL,'select * from aaa'). ¡Borramos todos los datos de la tabla 'aaa'!

¿Si quiero insertar datos en dicha tabla?

insert into openquery(LINKED_MYSQL,'select * FROM aaa')
(Field1, Field2,...)
SELECT Field1, Field2,...
FROM Tabla

¿Y para actualizar datos?

Update openquery(LINKED_MYSQL,'Select * from aaa') SET Cod_Ind = 7
WHERE Cod_Ind = 7.5


http://www.forosdelweb.com/f21/como-hacer-insert-liskserver-por-openquery-238208/







17 comentarios:

  1. este post me ha salvado de muchas en el trabajo, que bueno que te haya servido!

    ResponderEliminar
  2. Muy buen post, saludos

    ResponderEliminar
  3. muchas gracias, me ha servido de mucha ayuda

    ResponderEliminar
  4. Para el insert no me funciono esa sintaxis me funciono esta:

    INSERT INTO
    OPENQUERY( link_mysql, 'SELECT columna FROM tabla')
    VALUES('Valor de la columna')

    ResponderEliminar
  5. Por cierto :) excelente post, se podría mejorar la forma en que posteas para una mejor legibilidad, he visto en otros varios blogs que la sintaxis de códigos la formatean.
    El contenido me ayudo bastante. ¡Gracias!

    ResponderEliminar
    Respuestas
    1. Hola Eduardo. Gracias por tus comentarios, tendré en cuenta mejorar la legibilidad, siempre hay donde mejorar! un gusto.

      Eliminar
  6. Detalle 2:

    Un update me funciona si pongo el where dentro del openquery no fuera.

    Sintaxis
    UPDATE
    OPENQUERY(
    LINK_MYSQL,
    'SELECT * FROM table WHERE ')
    SET column_name = 'Value'

    Saludos.
    PD: Utilizo Sql server 2008

    ResponderEliminar
  7. tengo un problema puedo ver las tablas mas no puedo ver los campos ni los valoes -- [OJO4].[admin_saintTEST]..[saExis] no contiene columnas que se puedan seleccionar o el usuario actual no tiene permisos en ese objeto.

    ResponderEliminar
  8. Buen tutorial y con un escenario al contrario?

    Tengo un servidor Debian 8 con syslog-ng, una bbdd mysql en dicho servidor donde registra los eventos del syslog en la bbd.

    Por otro lado tengo una bbdd SQLServer, donde tengo que mandar los datos, he probado directamente desde el syslog-ng sin exito, es posible mandar los datos desde MySQL a SQLServer?

    Gracias

    ResponderEliminar
  9. buenas tardes, como podria hacer lo mismo pero ejecutando la sentencia select desde el mysql a una tabla de ms sql? gracias

    ResponderEliminar
  10. En tu problema comentas que quieres pasar datos de SQLSERVER hacia Mysql pero estas haciendo lo contrario estas pasando datos de Mysql hacia SQLSERVER

    ResponderEliminar
  11. no se puede hacer la conexion desde mysql no tiene la funcionalidad

    ResponderEliminar

Todos los comentarios son bien recibidos...