Vincular PostgreSql a SQL Server 2012

En SQL Server la vinculación de servidores nos permite ejecutar sentencias SQL en motores de base de datos de terceros con la única restricción de que estos deben proporcionar una interfaz OLEDB u ODBC.  Es el caso que trataré en esta entrada del Blog: Vincularemos un servidor PostgreSQL 9.2 que se ejecuta en un servidor Centos 6.3 a un servidor SQL Server 2012 ejecutándose en un servidor Windows 2008.  Si deseas conocer más acerca de la vinculación de servidores o Linked Servers te recomiendo leer el siguiente enlace: Linked Servers

Preparar PostgreSQL para ser vinculado.

Antes de iniciar con la vinculación debemos realizar algunos ajustes en nuestro servidor PostgreSQL para permitir su vinculación a SQL Server. Estas tareas las realizaremos desde nuestro servidor Centos. Lo primero por hacer es asegurarnos que el esquema al que nos vincularemos desde SQL Server no se llame public debido a que es una palabra reservada.  De llamarse así deberemos modificarlo, eso lo podemos hacer haciendo uso de PgAdmin como se muestra en la siguiente imagen:

schema

Una vez modificado el nombre del Schema que vincularemos lo siguiente por hacer es permitir que se realicen conexiones a PostgreSql desde el servidor SQL Server,  para ello modificaremos el archivo pg_hba.conf estableciendo que la dirección IP del servidor SQL puede conectarse a nuestro servidor PostgreSQL como puede verse en el siguiente extracto de mi archivo de configuración:

# "local" is for Unix domain socket connections only
# IPv4 local connections:
host    all             all             192.168.1.74/32         password

Configurada la conexión reiniciamos PostgreSQL y continuaremos ahora en nuestro servidor Windows.

Vincular PostgreSQL En SQL Server

Como se indicó al inicio de esta entrada, para vincular PostgreSQL será necesario contar con una interfaz de conexión OLEDB u ODBC y para ello descargaremos del siguiente enlace:  PostgreSQL Odbc el archivo de instalación del conector ODBC de PostgreSQL. En mi caso por tener instalada la versión de 64 bits me he descargado: psqlodbc_09_01:0200-x64.zip

Descargado el conector ODBC descomprimimos el archivo y ejecutamos el instalador que nos guiará paso a paso. El proceso es muy sencillo pues solo se requiere presionar siguiente hasta finalizar el proceso de instalación.

installconector
Una vez instalado el conector, crearemos el DSN correspondiente para ello nos vamos al panel de control,  ejecutaremos el administrador de orígenes de datos y seleccionaremos la pestaña System DSN

 

odbcpostgre

 

 

Presionaremos el botón agregar y seleccionaremos como driver PostgreSQL Ansi como se ve en la imagen

 nuewodbc

 

Al presionar finalizar, el asistente nos pedirá proporcionar los datos de conexión al servidor PostgreSql. Esto lo haremos de la siguiente manera:

 

configurepstgdsn

  • Data Source: Identificador del DSN
  • Database: Nombre de la base de datos a la que nos conectaremos
  • Server: Ip del servidor PostgreSql
  • User Name: Nombre de usuario en PostgreSql
  • password: Contraseña del usuario en postgreSql.

Configurado nuestro DSN presionamos el botón Test y de ser correcta la configuración nos aparecerá el mensaje “Connection Sucessful”.Hecho lo anterior es posible a través de ODBC conectarnos a nuestro servidor PostgreSQL y tener acceso a sus objetos.

Lo siguiente por hacer es obtener la cadena de conexión necesaria para crear el servidor vinculado y para ello crearemos un archivo de extensión UDL, daremos doble click en él y en la pestaña Provider seleccionaremos “Microsoft Ole Db Provider for ODBC Drivers” y daremos click en siguiente para colocarnos en la pestaña Connection y configurarla como se muestra:

configureudl

 Debido a que al crear el DSN proporcionamos la base de datos, servidor y usuario de PostgreSQL bastará con seleccionar el DSN y el catálogo inicial. Presionamos el botón Ok para guardar los cambios y con el bloc de notas abriremos el archivo udl para obtener  la cadena de conexión necesaria para crear nuestro servidor vinculado:

[oledb]
; Everything after this line is an OLE DB initstring
Provider=MSDASQL.1;Persist Security Info=False;Data Source=postgresql;Initial Catalog=pruebas

Ejecutaremos entonces el SQL Server Management Studio para autenticarnos en nuestro servidor SQL Server. Una vez autenticados Seleccionaremos la rama “Server Objects / Linked Servers” y dando click con el botón derecho del mouse seleccionaremos la opción  “New Linked Server”

addlinkedserver

 

En la ventana de configuración del nuevo servidor vinculado colocaremos lo siguiente:

  • Linked Server: Nombre con que identificaremos el servidor (puede ser cualquiera)
  • Server type : Other Data Source
  • provider: Microsoft OleDb Provider for ODBC Drivers
  • product name: Nombre del producto ODBC
  • Data source: Nombre del DSN que creamos en el administrador de orígenes
  • Provider String: Cadena de conexión que generamos con ayuda del archivo UDL.

Quedando como puede verse en la siguiente imagen:

configurelinkedserver

 

Después de presionar aceptar el servidor vinculado será creado en nuestro servidor SQL Server permitiéndonos ver los objetos de PostgreSQL:

 

viewlinkedserver

 

y de esa manera podremos ejecutar sentencias como la siguiente:

 

pstgquerylnkserv

 

28 Comments

  1. he seguido casi al pie de la letra, en la creacion del linked server con la diferencia de que que mi base de postgres esta en ubuntu y el linked server lo hago desde sql server 2005…
    AL crear el linked server no crea el vinculo con postgres , he probado las conexiones en el ODBC de postgres y me indica que esta todo bien igual en el archivo udl la coneccion es correcta pero no me muestra nada en sql server ni me da error alguno de conexion…
    Faltara algun driver o algo asi?

  2. Saludos byron,

    ¿cuál es el nombre del esquema de tu servidor PostgreSQL? si es public, esa puede ser la razón de que no te muestre las tablas. ¿Puedes colocar la cadena de conexión?

  3. buscando con google, me he encontrado que la version de mi sql server 2005 express no me admite crear linked server..
    igual te paso la cadena de conexion:
    Provider=MSDASQL.1;Persist Security Info=False;Data Source=PostgreSQL30;Initial Catalog=05abril

  4. que tal me podrias ayudar con lo siguiente por favor, tengo ya cambie mi version de sql a 2008 r2 y ahora ya me puedo linkear a desde sql server a postgres pero al realizar una consulta me muestra el suguiente error:

    Cannot get the data of the row from the OLE DB provider “SQL Server” for linked server “(null)”. Conversion failed because the data value overflowed the data type used by the provider. (Microsoft SQL Server, Error: 7346)

    traducido!

    No se puede obtener los datos de la fila del proveedor OLE DB “SQL Server” para el servidor vinculado “(null)”. Error de conversión porque el valor de los datos desbordó el tipo de datos utilizado por el proveedor. (Microsoft SQL Server, Error: 7346)

    me podrias decir cual seria el inconveniente por favor

  5. la consulta es la siguiente

    SELECT *
    FROM [POSTGRES].[dbproduct].[publico].[account_account]

    la estructura de mi tabla(postgres) es:

    CREATE TABLE publico.account_account
    (
    id serial NOT NULL,
    parent_left integer,
    parent_right integer,
    create_uid integer,
    create_date timestamp without time zone,
    write_date timestamp without time zone,
    write_uid integer,
    code character varying(64) NOT NULL, — Code
    reconcile boolean, — Allow Reconciliation
    currency_id integer, — Secondary Currency
    user_type integer NOT NULL, — Account Type
    active boolean, — Active
    name character varying(256) NOT NULL, — Name
    level integer, — Level
    company_id integer NOT NULL, — Company
    shortcut character varying(12), — Shortcut
    note text, — Note
    parent_id integer, — Parent
    currency_mode character varying NOT NULL, — Outgoing Currencies Rate
    type character varying NOT NULL, — Internal Type

    )
    WITH (
    OIDS=FALSE
    );

    • Hola, pudiste solucionarlo??
      actualmente tengo sql server 2012, y logre vincular con mysql perfectamente, y ahora con postgresql si hace la conexion y me enlista las tablas pero al momento de querer hacer cualquier consulta me tira exactamente el mismo error, ya intente con ansi unicode, y hasta con otra verison de servidor de postgres y es lo mismo. alguna solucion?

  6. estimado si bien pude crear el LINK SERVER a POSTGRES tengo un pequeño error al recuperar una columna de tipo Bytea de Postgres, cuando consulto por el LINK SERVER a postgres me despliega el siguiente error:

    OLE DB provider “MSDASQL” for linked server “LINK” returned message “Conversión solicitada no permitida.”.
    Msg 7341, Level 16, State 2, Line 1
    Cannot get the current row value of column “[MSDASQL].fotografia” from OLE DB provider “MSDASQL” for linked server “LINK”.

    revisando foros se pudo evidenciar que esto se soluciona creando el LINK SERVER con el proveedor MSDASQL.1 para Sql Server 2008, pero en SQL SERVER 2012 no se reconoce este driver y no pude habilitarlo para SQL SERVER 2012, porfavor agradeceria tu ayuda

    • En SQL Server además de poder consultar de manera directa aprovechando el servidor vinculado, es posible hacer uso de openquery para ejecutar una consulta de manera directa al servidor para ejecutar operaciones nativas. Has probado si te funciona haciendo algo como Select * from OpenQuery(LinkedPGSQL,’Select fieldbinarya from schema.tabla’)

      • me falto acotar que la creacion del LINK SERVER con el proveedor MSDASQL funciona correctamente, y tal como indicas al utilizar OPENQUERY despliega el error:

        No se puede obtener el valor de fila actual de la columna “[MSDASQL].fotografia” del proveedor OLE DB “MSDASQL” para el servidor vinculado “XXXXX”.

        Para SQL SERVER 2008 R2 se soluciona esto utilizando el proveedor “MSDASQL.1”, pero para SQL SERVER 2012 no reconoce el proveedor, es por eso que si alguien pudo habilitarlo o tuvo el mismo problema solicitaria puedan colaborarme

        saludos.

      • buenas tardes, en un servidor linux tengo la base de datos postgresql y en otro servidor de windows server tengo la base de datos sql server 2014, al hacer la vinculacion que mencionaste en este blog podre hacer crear nuevos registros, modificarlos y eliminarlos de la BD de postgresql desde genexus que es el lenguaje de programacion que tengo conectado a la base de datos de Sql server 2014

  7. hola, si pude hacer la conexion y me despliega las tablas y todo, pero al querer hacer una consulta me sale el siguiente error:
    Error de Enumerar columnas para LinkedServer
    Excepción al ejecutar una instrucción o un proceso por lotes Transact-SQL. (Microsoft.SqlServer.ConnectionInfo)
    No se pueden obtener los datos de la fila del proveedor OLE DB “SQL Server” para el servidor vinculado “(null)”. Error de conversión. El valor ha desbordado el tipo de datos que usa el proveedor. (Microsoft SQL Server, Error: 7346)

    ya le cambie el nombre al esquema, probe con otro servidor de postgresql, hasta hice una nueva base de datos con una tabla y una columna y nada.

  8. Buenos dias, queria consultarles si alguno ha tenido este error.
    Msg 64, Level 20, State 0, Line 0
    Error en el nivel del transporte al recibir los resultados del servidor. (provider: Proveedor de TCP, error: 0 – El nombre de red especificado ya no está disponible.)
    Tengo SQL SERVER 2005 linkeado con POSTGRESQL y necesito insertar una tabla del primero a este otro. Anteriormente estaba funcionando y de un momento para otro dejo de hacerlo.
    Desde ya muchas gracias

  9. Hola al usar un dato tipo TEXT en el postgres en el sql indica que no es posible retornar los valores, Conversion no permitida.
    Que dato puedo usar en postgre para que no ocurra esto.

Deja un comentario