Table des matières
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.
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...
bremko: IP 192.168.0.4, base: testgis, table:communes_lr;
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.
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
Je vais commencer par quelques test rudimentaires puis essayer la requête SQL attendue
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)
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.