Press "Enter" to skip to content

Conexión de dos base de datos en POSGRESQL, con DBlink

leninmhs 6

 

En algún momento trabajando con bases de datos, nos vamos a encontrar con la necesidad de cruzar información contenida en una o más tablas que están en diferentes bases de datos, las cuales pueden estar instaladas localmente o en otro servidor.

 

¿Que hacemos en este caso?

Para no tener que copiar , restaurar o duplicar esta(s) tabla(s) en otra base de datos, POSTGRESQL ofrece un objeto llamado Dblink, el cual es un conjunto de funciones que permite realizar conexiones entre bases de datos que estén instaladas en un servidor local o remoto.

 

¿Como hago para instalar Dblink?

Primeramente debemos tener instalado PostgreSQL, y suponiendo que trabajamos en linux, procedemos a instalar el paquete contrib de la versión de Postgres que estemos utilizando (en mi caso utilizo la versión 9.0), mediante el siguiente comando:

# aptitude install postgresql-contrib-9.0

 

Seguidamente accedemos al directorio de Postgres, para instalar la función Dblink, logueados con el usuario postgres:

 

#su – postgres

 

Una vez logueados, nos ubicamos en el directorio:

 

#cd /usr/share/postgresql/9.0/contrib/

 

Ahora procedemos a instalar la función de Dblink, en la base de datos principal desde donde queremos hacer la conexión, ejecutando la siguiente instrucción:

 

#psql tu_base_datos -h localhost < dblink.sql

 

Ejemplos de uso:

 

Para conexión local: #psql contrato_personas -h localhost < dblink.sql

Para conexión a servidor remoto: #psql contrato_personas -h 172.168.1.120 < dblink.sql

Y listo!!! ya tenemos instaladas las funciones de Dblink en nuestra base de datos…

 

Síntesis para conectar dos base de datos con Dblink:

 

SELECT a.campo1, a.campo2, sub.campo5,sub.campo4

FROM tabla1 a,

dblink(‘dbname=base_datos hostaddr=ip_servidor user=usuario password=clave port=5432′,’SELECT campo5, campo4 FROM tabla’) as sub(campo5 integer,campo4 varying(20) )

WHERE a.campo1=sub.campo4

 

 

Explicación:

 

1.- Realizo un SELECT normal con los campos que quiero mostrar.

2.- El dblink lo utilizo a nivel del FROM como si hiciera un subconsulta para llamar a otra tabla. Lo compongo de la siguiente forma:

– El nombre de la base de datos de la cual quiero obtener la información.

– En la opción hostaddr coloco la ip del servidor donde esta la base de datos, en caso de ser local utilizo 127.0.0.1.

– En user el usuario de la base de datos (puede ser postgres).

– La clave del usuario de base de datos.

– Y el puerto de conexión que por defecto es el 5432, sino ha sido modificado.

– Nota, si las bases de datos están en el mismo servidor ya sea local o remoto, puedo obviar las opciones de hostaddr, user, password y port; ya que los toma por defecto de la conexión.

 

Seguidamente realizo el SELECT con todos los parámetros que necesito y le asigno un alias en este caso lo llame ‘sub’. Continuo asignado un tipo de dato a cada campo que utilizo en el SELECT de la consulta que hice en el Dblink, y para finalizar comparo los campos que necesito de las base de datos ya interconectadas en clasula WHERE del SELECT principal.

 

Y eso es TODO… Sencillo verdad, ahora veamos un ejemplo practico.

 

Supongamos que tenemos dos base de datos, una llamada ubicación en la que tenemos la siguientes tablas:

dblink-postgresql-pgadmin

Y otra llamada contrato_personas, en la que se tiene una tabla de personas:

dblink-postgres-table

Si por algún motivos se requiere cruzar la tabla personas (de contrato_personas ) con la tabla persona (de ubicacion), mediante el campo de cédula, con el objetivo de obtener el estado donde habita la persona. Para ello utilizamos la función Dblink, de la siguiente forma:

 

SELECT a.nombre_completo, a.cedula, sub.cedula,a.sexo, a.estado_civil,a.edad, sub.nombreFROM personas a,dblink(‘dbname=ubicacion’,’SELECT d.cedula, e.nombre FROM persona d, estado e WHERE d.id_estado=e.id and d.valido=true’) as sub(cedula character varying(15), nombre character varying(20) )WHERE a.cedula=sub.cedula

 

Y listo, ya tenemos información de dos tablas cruzadas de dos bases de datos distintas…

 

 Por: LorendyM

 

  1. ref ref

    como hago la union tres tablas que estan el difenrete gestores de base de datos

  2. broger broger

    Hola tengo el error : could not open extension control file “/usr/local/pgsql/share/extension/dblink.control”: No existe el archivo o el directorio estoy usando postgres 9.3 sobre unUbuntu 12.04.5 LTS

  3. servidores_inapymi servidores_inapymi

    Buen dia de que repositorio puedo descargar, toda vez que el de NZ no me esta funcionando

  4. Betsy Palencia Betsy Palencia

    Saludos para versiones de 9.1 en adelante es necesario agregar la extensión de la siguiente forma:

    psql -d orion -c “CREATE EXTENSION dblink”.

    Pueden verificar si ya tenemos el db_link con la siguiente sentencia:

    SELECT pg_namespace.nspname, pg_proc.proname
    FROM pg_proc, pg_namespace
    WHERE pg_proc.pronamespace=pg_namespace.oid
    AND pg_proc.proname LIKE ‘%dblink%’;

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *