PostgreSQL : créer et utiliser des datalinks
Un datalink – dblink dans PostgreSQL – peut se définir comme un moyen de se connecter à partir d’un cluster – ou instance PostgreSQL – à un autre cluster localisé ou non sur la même machine. Autrement dit, à l’aide d’un datalink, vous pouvez interroger une base de données distante, extraire des informations, ajouter des informations à partir de cette base.
Installation sous Ubuntu Server
L’installation sous Ubuntu Server 11.10 se fait très simplement :
apt-get install postgresql-contrib-9.1
Mettre en place l’extension dblink
Vous devez tout d’abord vous connecter en local à PostgreSQL :
su postgres
psql
Une fois connecté(e), vous devez exécuter le script dblink et créer l’extension :
\\i /usr/share/postgresql/9.1/extension/dblink--1.0.sql
CREATE EXTENSION dblink;
\\q
Extraction de données
L’exemple ci-dessous permet d’extraire les données du champ client_rs de la table crm.client de la base erp de l’instance de la machine dont l’ip est 147.99.98.255, qui s’exécute sur le port tcp par défaut. Vous pouvez taper tous ces ordres SQL à partir de pgAdmin.
SELECT
*
FROM
dblink('hostaddr=147.99.98.255 port=5432 user=postgres dbname=erp password=postgres',
'SELECT client_rs FROM crm.client')
AS clients(client varchar(100));
Ajout de données à une table existante (1re méthode)
Cet autre exemple illustre la manière de récupérer des données d’une instance à une autre, en les ajoutant à partir d’une table distante.
INSERT INTO crm.client(client_rs,client_cp,client_ville)
SELECT
*
FROM
dblink('hostaddr=147.99.98.255 port=5432 user=postgres dbname=erp password=postgres',
'SELECT client_rs,client_cp,client_ville FROM crm.client WHERE client_rs=''linux''')
AS clients(client varchar(100), cp integer,ville varchar(50));
Ajout de données à une table existante (2e méthode)
L’exemple est une variante, s’appuyant sur le SELECT… INTO plutôt que d’utiliser l’instruction INSERT INTO.
SELECT
*
INTO TABLE crm.client
FROM
dblink('hostaddr=147.99.98.255 port=5432 user=postgres dbname=erp password=postgres',
'SELECT client_rs,client_cp,client_ville FROM crm.client')
AS clients(client varchar(100), cp integer,ville varchar(50));
Création de table
Je termine ce petit tuto par un script SQL de création de table locale à partir d’une table d’une machine distante.
CREATE TABLE crm.client AS
SELECT
*
FROM
dblink('hostaddr=147.99.98.255 port=5432 user=postgres dbname=postgres password=postgres',
'SELECT * FROM crm.client')
AS clients(client_id integer,client_rs varchar(100), client_cp integer, client_ville varchar(50));