Sommaire Etablir une connexion avec une base de données distante sur PostGreSQL 1 Connexion avec le module dblink...3 1.1 Création du module dblink... 3 1.2 Exemple de Mise en oeuvre... 4 1.3 Création de la table... 6 1.4 Déconnexion... 7 2 Connexion avec le module postgres_dwd...7 2.1 Création du module postgres_fdw... 7 2.2 Connexion à la base de données gb_cons_eau... 7 2.3 Vérification si la connexion est bonne :... 8 2.4 Suppression de la connexion... 9 2.5 Création de la table rpg... 9 1
Préambule Souvent on souhaite interroger une base de données distante afin de croiser les données extraites d une table de cette base avec une base de données locale. On entend par base locale, la base de données sur laquelle on est entrain de travailler dans PostgreSql. On serait tenté pour des raisons de facilité de copier cette table de la base distante dans la base de travail. Ce qui n'est pas sans conséquence dans la fiabilité des données (redondance, mise à jour à surveiller...). Pour éviter d avoir plusieurs copies de tables dans plusieurs bases de données, on peut installer des modules de connexion entre les bases. PostgreSql dispose d'extension qui peuvent être mises en œuvre pour établir des liaisons entre les bases de données, afin d'interroger les tables contenues dans cette base. Il s agit des extensions dblink, et postgres_fdw. Ces extensions comme beaucoup d'autres, ne sont pas nativement installées dans PostgreSql : Il faudra donc créer. 2
1 L extension dblink 1.1 Création du dblink Depuis PgAdmin cliquer sur le requêteur de PgAdmin et saisir l'expression suivante : Create extension dblink Dans le schéma Public, dans la liste des fonctions vous voyez apparaître une liste de fonctions liées au module dblink comme l'indique la figure suivante : Une fois le module installé on va utiliser la fonction dblink_connect pour établir une connexion. Pour se faire on va se servir d'un exemple bien concret. 3
1.2 Exemple de Mise en oeuvre Souvent, le service de l'économie agricole souhaite extraire les îlots agricoles qui intersectent une zone zpaac. Il souhaite à la fois récupérer tous les attributs liés à la couche n_rpg2014_s_076 qui se trouve dans le schéma n_parcellaire_agricole dans la base qui s'appelle gb_cons_agriculture avec le nom de la zpaac issu de la couche n_protection_aac_aep_s_076 dans le schéma n_zonages_eau qui se trouve dans la base gb_cons_eau. Dans cette table n_protection_aac_aep_s_076, deux champs nous intéressent particulièrement : le nom de la zpaac(nom_zpaac) et le champ géométrique (geom). On va donc depuis la base gb_cons_agriculture établir cette connexion et récupérer ces deux champs, la base distante sur laquelle nous souhaitons nous connecter est bien gb_cons_eau. On va lancer la requête suivante pour nous connecter à la base gb_cons_eau : select * from dblink_connect('sea','host=localhost user=postgres password=postgres dbname=gb_cons_eau') Exécutez cette requête en cliquant sur F5 ou le bouton d'exécution de requête de PgAdmin. Si vous avez le message Ok comme indiqué dans la figure ci-dessous, c'est que la connexion est établie Sinon vous avez une erreur dans vos paramétrages qu'il faut corriger. Explication : 4
dblink_connect : fonction qui vous permet de vous connecter à un serveur distant sea : est le nom de la connexion que vous pouvez rappeler à chaque fois que vous désirez vous connectez sur cette base (vous n'êtes plus obligé de renseigner tous les paramètres qui suivent) host= à la place de localhost vous pouvez donner toute autre adresse IP de serveur postgresql hébergeant votre base auquel vous avez les droits ah doc. user : est le l'utilisateur habilité à se connecter sur cette base et à exécuter des requêtes sur les tables de cette même base password : est son mot de passe dbname : est le nom de la base de données sur laquelle vous souhaitez vous connecter. Attention aux apostrophes qui entourent le protocole de connexion à la base et au nom de connexion à cette base séparé par une virgule. Maintenant que la connexion est établie, on cherche à rapatrier les champs qui nous intéressent : le nom de la zpaac(nom_zpaac) et la géométrie des objets (geom). Pour tester si la connexion fonctionne bien, on peut lancer la requête suivante : select * from dblink('sea','select nom_zpaac,geom from n_zonages_eau.n_protection_aac_aep_s_076') as n_protection_aac_aep_s_076 ( nom_zpaac char varying(100), geom geometry ) 5
Explications: dans le select c'est une sélection classique que l'on fait habituellement. dblink reçoit deux paramètres : le nom de la connexion que vous venez d'établir entouré de 2 apostrophes : un au début et un à la fin, suivi d'une virgule puis de la sélection dans la table désirée entourée également d'apostrophes comme pour le nom de la connexion. Avec le as : on construit une pseudo table qui doit contenir les champs que l'on récupère : ici nom_zpaac et le geom) avec leur typologie. Cette typologie doit être la même que celle contenue dans la table d'origine. Le nom de la pseudo table peut être changé ainsi que les champs si vous le souhaitez, mais pas les types. Si vous exécuter cette requête vous devez avoir les deux champs avec leurs contenus qui s'affichent sur le panneau de sortie du requêteur de PgAdmin. 1.3 Création de la table Faisons maintenant la requête d'intersection (St_intersects) qui permet de créer une table qui contient les îlots rpg contenus dans une zpaac dont le nom est angerville. Create table rpg_angerville as select n_rpg2014_s_076.*, nom_zpaac from n_parcellaire_agricole.n_rpg2014_s_076, select * from dblink('sea','select nom_zpaac,geom from n_zonages_eau.n_protection_aac_aep_s_076') as n_protection_aac_aep_s_076 (nom_zpaac char varying(100),geom geometry) where st_intersects(n_rpg2014_s_076.geom, n_protection_aac_aep_s_076.geom and nom_zpaac='angerville' Et voila votre table est créée. 6
1.4 Déconnexion Pour vous déconnecter, lancer cette fonction de déconnexion Select * from dblink_disconnect('sea'). Vous voyez apparaître aussi le message OK. comme précédemment. 2 Connexion avec le module postgres_fdw 2.1 Création de l extension postgres_fdw Depuis PgAdmin cliquer sur le requêteur de PgAdmin et saisir l'expression suivante : Create extension postgres_fdw Dans le schéma Public, dans la liste des fonctions vous voyez apparaître une liste de fonctions liées au module postgres_fdw comme l'indique la figure suivante : Nous allons reprendre le même exemple de mise en œuvre vu avec le module dblink. 2.2 Connexion à la base de données gb_cons_eau Création d'une connexion au serveur distant Nous souhaitons nous connecter à la base de données gb_cons_eau : CREATE SERVER serv_gb_cons_eau FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '127.0.0.1', dbname 'gb_cons_eau', port '5432'); Puis exécuter en tapant sur F5 ou le bouton exécuter de PgAdmin Explication : o serv_gb_cons_eau est le nom de la connexion au serveur o host adresse du serveur o dbname est le nom de la base de données o port le port d écoute 7
Création d'un utilisateur habilité sur le serveur distant CREATE USER MAPPING FOR postgres SERVER serv_gb_cons_eau OPTIONS (user 'postgres', password 'postgres'); Explications : o Postgres dans create user mappin for : est le nom de l utilisateur o Server est le nom de connexion défini plus haut o Option : l utilisateur postgres avec le mot de passe postgres Puis exécuter en tapant sur F5 ou le bouton exécuter de PgAdmin Explication : Connexion à la table distante CREATE FOREIGN TABLE n_protection_aac_aep_s_076 (nom_zpaac char varying(100), geom geometry) SERVER serv_gb_cons_eau OPTIONS (schema_name 'n_zonage_eau',table_name 'n_protection_aac_aep_s_076' ); Puis exécuter en tapant sur F5 ou le bouton exécuter de PgAdmin Explications : o N_protection_aac_aep_s_076 est le nom de la pseudo table o Nom_zpaac, et geom se sont les deux champs qui souhaite récupérer avec leur types o Serv_gb_cons_eau est le nom de connexion au serveur o Dans Option on précise le schéma de la table distante et le nom de cette table. 2.3 Vérification select * from n_protection_aac_aep_s_076. Vous devez avoir les informations liées à cette table, comme si vous êtes à l intérieur de la base de données distante. 8
2.4 Création de la table rpg Create table rpg_angerville as select n_rpg2014_s_076.*,nom_zpaac from n_parcellaire_agricole.n_rpg2014_s_076, n_protection_aac_aep_s_076' where st_intersects(n_rpg2014_s_076.geom,n_protection_aac_aep_s_076.geom) and nom_zpaac='angerville' 2.5 Suppression de la connexion. Pour supprimer la connexion vous devez avant tout supprimer tous les objets liés à cette connexion. 1. Supprimer la table DROP FOREIGN TABLE n_protection_aac_aep_s_076 Sur le panneau de sortie vous devez avoir le message suivant : 2. Supprimer l'utilsateur DROP USER MAPPING IF EXISTS FOR postgres SERVER serv_gb_cons_eau; Puis F5. Vous avez le même message que précédemment. 3. Supprimer le serveur DROP server serv_gb_cons_eau. Si vous tentez de supprimer le serveur alors que vous n'avez pas supprimer liés au serveur vous avez le message suivant : 9
Avec l'extension postgres_fdw, vous pouvez, mettre à jour, supprimer des données, ajouter ou supprimer des colonnes avec les commandes : o Update o Alter o Delete. 10