Aller au contenu

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 :

plproxy_db1=# CREATE TABLE sessions ( id_session SERIAL, id_utilisateur integer CHECK(utilisateur_existe(id_utilisateur) IS TRUE));
plproxy_db1=# Insert into sessions("id_utilisateur") values(902);
ERREUR:  la nouvelle ligne viole la contrainte de vérification « sessions » de la relation « sessions_id_utilisateur_check »
plproxy_db1=# Insert into sessions("id_utilisateur") values(900);
INSERT 0 1