lunes, 3 de diciembre de 2012

Vicular Tablas de SQL SERVER en PostgreSQL



No sé si es un caso muy habitual, pero tengo que trabajar con un ERP que no tiene una estructura de datos muy bien normalizada, este funciona con una base datos SQL SERVER. Me puse de tarea confeccionar vistas que con una estrutura más sencilla, pero como no conozco a profundidad el SLQ SERVER no quiero arriesgar la estructura existente en este servidor y tampoco me quiero tomar el tiempo de aprender la sintaxis ni nada de SQL SERVER.

Entonces comencé a analizar a la posibilidad de vincular las tablas de SQL SERVER con una base de datos Postgres y me topé que esto es posible. Todavía no puedo hablar sobre el rendimiento de esta arquitectura, pero si le dejo un resumen de cómo hacerlo.

La tablas las he vinculado con ODBC FDW (ODBC Foreign Data Wrapper) que es una extensión de Postgres incluida desde las versión 9.

Pueden buscar los archivos necesarios para continuar, en el artículo ODBC Foreign Data wrapper - odbc_fdw on Windows del sitio  www.postgresonline.com, que de hecho es el sitio de donque saqué la información que ahora comparto desde aquí.

Para instalar la extensión:
  • Descomprimir el archivo fdw_winXX_91_bin.zip, que tiene adentro las carpetas bin, lib y share.
  • Copiar las carpetas bin, lib y share al directorio donde tienen instalado el PostgresSQL. Se darán cuenta que están copiado correctamente las carpetas pues estás ya existen (Deberán  fusionarlas).
  • Ingresar al PdAdmin (u otro cliente que utilizan) con el el usurio “postgres” y abrir un pantalla para realizar Querys SQL.
  •  Ejecutar  “CREATE EXTENSION odbc_fdw;”
Listo!, si no dió ningún error tenemos la extensión instalada correctamente.

Ahora tenemos que vincular las tablas, para esto me basé en el artículo ODBC Foreign Data wrapper to query SQL Server on Window - Part 2.
  • Ingresar a la opción “Orígenes de Datos ODBC” desde el menú de Windows.
  • Crear un nuevo Origen de Datos, en la pestaña “DNS Sistema”. (Crear un Origen de Datos es un tema a tratar a parte) y por ahora asumo que ya lo saben, el dato importante que utilizaremos a continuación es el nombre que le han asignado al “Origen de Datos”.  Recomiendo busquen el driver ODBC para SQL SERVER  más actualizado que sea posible según su versión de Base de Datos.
·         A partir de aquí lo hacemos nuevamente desde una pantalla de Querys de PgAdmin.
  • Creamos un Servidor Foráneo con la siguiente sentencia, este servidor es como una referencia a la conexión ODBC desde el Postgres.
CREATE SERVER <NombreServerDesdePG> FOREIGN DATA WRAPPER odbc_fdw OPTIONS (dsn '<NombreConexionODBC>');
  • Mapeamos un “Login Role” o los que sean necesarios con un usuario de la Base de Datos SQL SERVER. En mi caso cree un único usuario en ambas bases, y con eso manejo perfecto desde la aplicación. 
CREATE USER MAPPING
     FOR <UsuarioPostgres>
     SERVER <NombreServerDesdePG>
OPTIONS (username '<UsuarioSQLServer>', password '<PassSQLServer>');
  •  Es recomendable pero no obligatorio que creen un esquema donde podrán todas las tablas foráneas.
CREATE SCHEMA <TablasForaneas>;
  • Creamos las “Tablas Foraneas” que son las que accederán por debajo a las tablas SQL SERVER según la Query que le asignemos, y desde el Postgres las llamamos como una tabla cualquiera.
CREATE FOREIGN TABLE <TablasForaneas>.<NombreTablaPostgres>
    (orderid integer NOT NULL
    , customerid varchar(20) NOT NULL )
SERVER <NombreServerDesdePG> 
    OPTIONS (database '<NombreDBSQLSERVER>', schema '<SchemaSQLServer>', sql_query 'SELECT orderid, customerid FROM orders', sql_count 'select count(orderid) from orders');
 
Listo!, ya deberíamos poder acceder los datos que devuelve el query ejecutado sobre el SQL SERVER desde la tabla <TablasForaneas>.<NombreTablaPostgres> en Postgres.

Les dejó aquí una minúscula aplicación que crea este script por nosotros, lo único que deberán hacer es definir la estructura de la SQL SERVER. La aplicación creará el script en C:/ (Ya veré más adelante para mejorarla). 


Espero sea de utilidad para alguno que otro, que también esté con esta necesidad.