PostgreSQL DBlink

🐘👩🏼‍💻 PostgreSQL & DBlink, conexión de dos base de datos

Aprende a realizar una conexión local o remota entre dos bases de datos de PostgreSQL usando el modulo DBlink, con ejemplo practico y rápido.

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

PostgreSQL & DBlink

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.

PostgreSQL & DBlink

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…

Deja un comentario

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