Requêtes inter-bases
Il peut être nécessaire de réaliser des requêtes inter-bases de données. PostgreSQL propose deux extensions permettant des liaisons avec des bases autre que celle sur laquelle la connexion est établie. Il s'agit de Dblink et Postgres_FDW (PostgreSQL > 9.3). Les bases peuvent être sur un serveur distant.
Ces extensions ne sont pas nativement installées dans PostgreSQL ; il faut donc les créer si elle ne sont pas disponibles. Pour voir si une extension est disponible examiner la partie extensions de la base sous PgAdmin :

Méthode : DBLINK
Si l'extension n'est pas installée il faut utiliser la commande :
CREATE EXTENSION dblink ;
Il se peut que vous rencontriez le message :
ERREUR: n'a pas pu ouvrir le fichier de contrôle d'extension « /usr/share/postgresql/9.3/extension/dblink.control » : Aucun fichier ou dossier de ce type
Voir dans ce cas avec l'administrateur système pour installer les paquets de contributions complémentaires (sudo apt-get install postgresql-contrib
).
Une fois le module installé, il est possible d'utiliser dblink_connect
pour établir une connexion.
Pour faire un exercice, nous souhaitons faire une requête entre la table production.route_xy de la base droitsXX et la table consultation.commune de la base newdroitXX (créée dans le module 2 sur l'administration de PostgreSQL).
Dans pgAdmin, se connecter à la base droitsXX avec le rôle stageXX.
Exécuter :
select * from dblink_connect('demo','host=localhost user=stageXX password=stageXX dbname=newdroitXX') ;
(demo est le nom de la connexion qui permettra de ne pas renseigner tous les paramètres dans le prochain appel)
nb : On utilise localhost car on est déjà connecté sur le serveur et que l'on souhaite se reconnecter dans une autre base du même serveur.
Le cas échéant il faut préciser le port d'écoute du serveur, si ce n'est pas celui par défaut (5432), exemple :
select * from dblink_connect('demo','host=172.XX.XX.XXX port=5632 user=postgres password=postgres dbname=stage00')
Si vous avez le message OK comme indiqué ci-dessous, la connexion est établie :

Il est maintenant possible de réaliser des requête sur la table distante avec
:dblink
Exemple :
WITH toto AS (SELECT * from dblink('demo', 'select insee_comm, geom FROM consultation.commune')
as foo(insee_comm character(5), geom geometry(MultiPolygon, 2154)))
SELECT production.route_xy.*, toto.insee_comm FROM production.route_xy, toto
WHERE st_intersects(production.route_xy.geom, toto.geom);
nb : foo est en gros, l'équivalent de toto en anglais !
Pour se déconnecter on utilisera :
SELECT * FROM dblink_disconnect('demo')
Attention :
Pour pouvoir se connecter sur le serveur 'distant' il faut que ce soit autorisé dans le fichier ph_hba.conf du serveur 'distant'. Si le serveur 'distant' est le même (comme dans l'exemple ci-dessus) et si l'adresse IP du serveur est 10.167.71.3 il faut avoir quelque chose comme :
host all all 10.167.71.3 /32 md5
Méthode : FDW
postgres_fdw propose a peu près les mêmes possibilités tout en étant en général plus performant.
si l'extension n'existe pas la créer :
CREATE EXTENSION postgres_fdw ;
Avec le même exemple que pour Dblink on aura (remplacer XX par votre numéro de stagiaire) :
CREATE SERVER demo FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '172.26.62.50', dbname 'newdroitXX', port '5432') ;
L'ordre SQL peut-être généré sous pgadmin à partir de l'assistant :
puis en entrant les différentes options :
Création d'un utilisateur habilité (remplacer XX par votre numéro de stagiaire):
CREATE USER MAPPING FOR stageXX SERVER demo OPTIONS (user 'stageXX', password 'stageXX') ;
que l'on peut créer par l'assistant sous pgadmin :
Création de la la table distante (il faut donner la liste des colonnes comme pour la création d'une table)
CREATE FOREIGN TABLE commune(geom geometry(MultiPolygon, 2154), nom_comm character varying(50)) SERVER demo OPTIONS (schema_name 'consultation', table_name 'commune') ;
Que l'on peut créer par l'assistant sous pgadmin :
La table apparaît désormais dans la liste des tables distances du schéma public :
Il est maintenant possible d’exécuter une requête comme si la table commune était locale :
SELECT * FROM production.route_xy, commune WHERE
st_intersects(production.route_xy.geom, commune.geom)
;
Pour supprimer la connexion sur une table on utilisera :
DROP FOREIGN TABLE commune ;
pour un utilisateur :
DROP USER MAPPING IF EXISTS FOR geoadmin SERVER demo ;
et pour le serveur (il faut d'abord avoir supprimé les objets liés) :
DROP SERVER demo ;
On peut également utiliser le clic droit > supprimer sur les objets dans pgadmin.
Complément : FDW et optimisation
nb : A partir de PostgreSQL 9.6 Il est possible pour des raisons de performances d'ajouter extension 'postgis'
au moment de la création du serveur ce qui donne :
CREATE SERVER demo FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '172.26.62.50', dbname 'newdroitXX', port '5432', extension 'postgis') ;
Comme indiqué ici , il est de la responsabilité de l'utilisateur que les extensions listées existent bien et se comportent de façon identique sur les serveurs local et distant.
Complément : FDW pour intégrer différentes ressources externes
FDW dispose en réalité de nombreux connecteur de données distantes.
Il faut contacter, le cas échéant, l'administrateur système du serveur pour faire installer ces connecteurs.
Nous donnons ci-dessous un exemple avec ogr_fdw pour se connecter à un ensemble de fichier SHP (ogr_fdw est disponible par défaut dans les paquets PostGIS à partir de la version 2.2.0).
-- si pas déjà fait
CREATE EXTENSION ogr_fdw ;
-- creation du FDW pour OGR
CREATE FOREIGN DATA WRAPPER ogr_fdw
HANDLER ogr_fdw_handler
VALIDATOR ogr_fdw_validator;
--
-- création du serveur
CREATE SERVER serv_shp_geobase_referentiels_bdcarto_2015_administratif
FOREIGN DATA WRAPPER ogr_fdw
OPTIONS (datasource '//SBL87-GEOIDE/GB_REF/0_REFERENTIELS/BDCARTO_087_2015/1_DONNEES_LIVRAISON/ADMINISTRATIF',format 'ESRI Shapefile');
--
-- creation du schéma d'accueil
create schema referentiels_bdcarto_2015_administratif;
--
-- création des foreign tables dans ce schéma
import foreign schema ogr_all from server serv_shp_geobase_referentiels_bdcarto_2015_administratif into referentiels_bdcarto_2015_administratif;
--
Complément : FDW : Import de schémas à partir de PostgreSQL 9.5
PostgreSQL 9.5 offre la possibilité d'importer des schémas entier avec IMPORT FOREIGN SCHEMA
Les nouvelles tables externes sont toutes créées dans le schéma cible, qui doit déjà exister.
L'utilisateur doit avoir le droit USAGE sur l'instance distante, ainsi que le droit CREATE sur le schéma cible.