Annexe C. Dblink: interroger plusieurs serveurs PostgreSQL distants

Table des matières

C.1. Matériel requis pour la simulation
C.2. Compilation et installation
C.3. Mise en oeuvre
C.3.1. Premiers tests
C.3.2. Test attendu

Dblink est un module de PostgreSQL qui permet d'interroger des serveurs distants ou des instances du même serveur sur la même machine. Il est fournit dans les sources de PostgreSQL.

C.1. Matériel requis pour la simulation

Nous prendrons pour cet article le cas de deux machines ayant chacune un serveur PostgreSQL. Ceci est bien sûr le cas le plus simple d'utilisation.On peut facilement l'étendre à 3,4 etc...

  1. bremko: IP 192.168.0.4, base: testgis, table:communes_lr;

  2. jenna: IP 192.168.0.5, base: testgis2, table:departements_lr.

Le suffixe "_lr" désigne la région Languedoc-Roussillon. Il s'agit donc des communes et des départements du Languedoc-Roussillon. Mon but ici est de connaître l'ensemble des communes de la région limitrophes au département de l'Hérault (code insee=34). Les données et les tables ici présentées ont déjà été mentionnées dans le chapitre "Etudes de cas". C'est sur bremko que je décide d'installer le module dblink. Pour gagner du temps, je vais supposer ici que mes deux tables sont convenablement indexées sur leur champ géométrique respectif. Je vais aussi supposer que les deux tables sont dans le schéma public de leur base respective.

Figure C.1. Mes deux bases distantes: testgis et testgis2

Mes deux bases distantes: testgis et testgis2

C.2. Compilation et installation

L'installation de Dblink est une installation classique. Pour sa compilation en tant que root, je fais

cd /mnt/sources/postgresql-8.2.3/contrib/dblink
make
make install

Maintenant, je deviens propriétaire de la base tesgis - ici postgres - sur bremko et je dote ma base des fonctionnalités de dblink

su postgres
psql -d testgis -f /opt/pgsql/share/contrib/dblink.sql

C.3. Mise en oeuvre

Je vais commencer par quelques test rudimentaires puis essayer la requête SQL attendue

C.3.1. Premiers tests

Depuis bremko, je me connecte à ma base testgis en faisant psql testgis. Grâce à dblink, je vais essayer de me connecter à la base testgis2 sur jenna. Sur jenna, l'utilisateur est damien ayant le mot de passe morphine. Ma connexion, je vais l'appeler c1. Je commence par ouvrir la connexion en utilisant la fonction dblink_connect():

testgis=# SELECT * from dblink_connect('c1','hostaddr=192.168.0.5 port=5432 dbname=testgis2 user=damien password=morphine');
 dblink_connect
----------------
 OK
(1 ligne

J'effectue une requête simple qui me renvoit les données attributaires de la table departements_lr grâce à dblink()

testgis=# SELECT * FROM dblink('c1','SELECT gid,id,nom,numero FROM departements_lr',true) 
AS foo(gid int,id int,nom text,numero text) ORDER BY nom;
 gid | id |        nom          | numero
-----+----+---------------------+--------
   4 |  4 | Aude                | 11
   2 |  2 | Gard                | 30
   1 |  1 | Herault             | 34
   3 |  3 | Lozère              | 48
   5 |  5 | Pyrénées Orientales | 66
(5 lignes)

Je ferme ensuite ma connexion c1 grâce à dblink_disconnect()

testgis=# SELECT * from dblink_disconnect('c1');
 dblink_disconnect
-------------------
 OK
(1 ligne)

C.3.2. Test attendu

Pour se faire, je vais ici supposer qu'un connexion c1 est ouverte. Il me suffira de faire

testgis=# SELECT c.nom,c.insee FROM communes_lr c, 
dblink('c1','SELECT nom,the_geom FROM departements_lr',true) AS foo(nom text,the_geom geometry) 
WHERE   foo.nom='Herault' 
AND c.the_geom && foo.the_geom 
AND touches(c.the_geom,foo.the_geom) 
AND c.nom NOT LIKE '34%';

On notera ici que

  • WHERE foo.nom='Herault' est utilisé pour ne retourner que le contour départemental de l'Hérault de la table departements_lr;

  • c.the_geom && foo.the_geom est utilisé pour tirer profit des index spatiaux;

  • AND c.nom NOT LIKE '34%' pour ne pas retourner les communes internes de l'Hérault.

Au niveau de , pour la confirmation de l'utilisation des index spatiaux, un simple EXPLAIN ANALYZE au début de la requête confirmera leur emploi.