PL/Proxy
¶
PL/Proxy est un gestionnaire de langage procédural (PL) pour PostgreSQL qui permet d’effectuer des appels de procédures distants entre des bases de données PostgreSQL, avec un sharding optionnel.
Installation¶
Sur un serveur Debian/ubuntu l’installation se déroule de la manière suivante :
sudo apt-get install postgresql-8.3 postgresql-8.3-plproxy
su - postgres
psql -f /usr/share/postgresql-8.2-plproxy/plproxy.sql plproxy_db1
Exemple de Connexion à distance¶
Sur le premier serveur :
postgres=# CREATE DATABASE plproxy_db1;
CREATE DATABASE
postgres=# \c plproxy_db1
plproxy_db1=# CREATE TABLE utilisateurs ( id INT, nom TEXT);
CREATE TABLE
plproxy_db1=# INSERT INTO utilisateurs VALUES (900, 'M. Dupuis');
INSERT 0 1
Sur le second serveur :
postgres=# CREATE DATABASE plproxy_db2;
CREATE DATABASE
postgres=# \c plproxy_db2
plproxy_db2=# CREATE TABLE utilisateurs ( id INT, nom TEXT);
CREATE TABLE
plproxy_db2=# INSERT INTO utilisateurs VALUES (900, 'M. Dupuis');
INSERT 0 1
Mise en place des fonctions¶
Sur le second serveur :
plproxy_db2=# CREATE OR REPLACE FUNCTION utilisateur_existe(integer)
RETURNS boolean AS
$$
SELECT CASE WHEN id = $1
THEN TRUE
ELSE FALSE
END
FROM utilisateurs
WHERE id = $1;
$$ LANGUAGE 'SQL';
On teste la fonction sur plproxy_db2
:
plproxy_db2=# select utilisateur_existe(900);
utilisateur_existe
--------------------
t
(1 ligne)
plproxy_db2=# select utilisateur_existe(901);
utilisateur_existe
--------------------
(1 ligne)
Sur plproxy_db1
:
plproxy_db1=# CREATE OR REPLACE FUNCTION utilisateur_existe(integer)
RETURNS boolean AS
$$
CONNECT 'dbname=plproxy_db2 host=192.168.0.9 port=5342';
$$
LANGUAGE 'plproxy';
Testons l’appel à la fonction distante :
plproxy_db1=# select utilisateur_existe(900);
utilisateur_existe
--------------------
t
(1 ligne)
plproxy_db1=# select utilisateur_existe(901);
utilisateur_existe
--------------------
(1 ligne)
Utilisation concrète¶
On peut désormais créer une table sur plproxy_db1
avec une contrainte d’intégrité dépendant de données situées sur plproxy_db2
.
Par exemple :