Le Système de Gestion de Bases de Données PostgreSQL de la distribution CNRS-ENSTA

Sovanna TAN

Université Paris XII-Val de Marne

Ce document est disponible en ligne sur ftp://ftp.ensta.fr/pub/linux/applis.rh50/postgres.html


La distribution CNRS-ENSTA contient un SGBD relationnel orienté objets appelé postgreSQL, version 6.2.1. 1 Ce système est dérivé du SGBD POSTGRES, prototype de recherche conçu sous la direction du Professeur Michael STONEBRAKER à l'université de Berkeley. Dans cet article, nous décrivons

Signalons qu'outre les interfaces détaillées ici, les sources de postgreSQL contiennent aussi des interfaces pour les langages C++ et Perl 5. Seules les installations des interfaces avec Tcl/TK et Java nécessitent des ressources qui ne sont pas directement disponibles sur le cdrom CNRS-ENSTA. Sauf mention explicite, les commandes décrites dans les quatre premières parties peuvent s'effectuer sur une machine qui n'est pas mise en réseau.

Utilisation et administration

Le système fonctionne sur le modèle client/serveur. Un programme démon postmaster reçoit les requêtes des clients concernant les bases de données. La connexion est établie au moyen de sockets TCP. Lors d'une demande de connexion, le démon se duplique, un des programmes continue à écouter les demandes de connexion, l'autre traite les requêtes du client. Sur un réseau TCP/IP, les client peuvent se trouver sur des machines distinctes de celle sur laquelle tourne le serveur et dialoguer avec ce dernier à travers le réseau.

Le serveur postmaster est lancé au boot par le script /etc/rc.d/init.d/postgresql. Les fichiers exécutables pour postgreSQL se trouvent dans /usr/bin et les autres dans le répertoire /var/lib/pgsql.

Création des utilisateurs et des bases de données

Initialement, seul l'utilisateur postgres a le droit d'utiliser le système. Mais il peut créer des utilisateurs avec qui partager ses pouvoirs ou des utilisateurs ayant des droits plus restreints. Comme un utilisateur de postgreSQL peut lier dynamiquement du code au moteur du système, pour des raisons de sécurité, root n'a pas le droit d'utiliser postgreSQL. Seuls les utilisateurs qui ont le droit d'en ajouter d'autres ont le droit de charger des fonctions écrites en C. L'utilisateur pierre peut ensuite créer une base avec On dispose du client psql pour travailler sur les bases auxquelles on a accès.

Manipulation des tables d'une base

On définit une table avec 2 On la remplit. On peut la consulter. Le langage supporté est un sous ensemble de SQL-92. En plus du modèle relationnel standard, postgreSQL permet de définir des tables à partir d'autres tables par héritage. Il permet aussi de définir des attributs qui ne sont pas atomiques mais des tableaux.
mabase=> create table journ_spec(theme char16[]) inherits (journaux)\g
CREATE
mabase=>  insert into journ_spec values ('Byte','4/1/98','{"informatique","pc"}')\g
INSERT 17660 1
On peut effectuer des commandes sur l'ensemble des tables dérivées d'une table. Certaines fonctionnalités comme les sous requêtes ou la clause HAVING dans un un GROUP BY manquent. Toutefois, l'utilisateur a la possibilité d'ajouter au système des fonctions écrites en SQL ou en C.

Etablissement d'une connexion à travers un réseau TCP/IP

Par défaut, seuls les clients fonctionnant sur la même machine que postmaster peuvent se connecter aux bases de données. Pour autoriser les clients tournant sur une autre machine, il faut déclarer cette dernière dans le fichier /var/lib/pgsql/pg_hba.conf. Supposons que l'on veuille autoriser des programmes clients tournant sur une machine appelée machine1 dont l'adresse IP est 192.168.25.1 à se connecter au serveur qui tourne sur une machine appelée serveur1. Supposons en outre que les numéros des utilisateurs de postgreSQL correspondent aux numéros des utilisateurs Unix et sont identiques sur les machines serveur1 et machine1. On ajoute dans le fichier pg_hba.conf de serveur1 la ligne suivante: Ensuite il faut relancer postmaster sur serveur1. L'utilisateur root doit effectuer les commandes On se connecte à partir de machine1 au postmaster de serveur1 lorqu'on est un utilisateur autorisé avec

Extension de postgreSQL avec des types utilisateurs et des fonctions

Voici un exemple inspiré du tutorial de postgreSQL qui consiste à ajouter un type nombre complexe au système. On définit le type Complex et des fonctions d'entrées/sorties complex_in() et complex_out() en langage C. Les fichiers de déclaration qui apparaissent au début du programme se trouvent dans le répertoire /usr/include/pgsql. Pour inclure ces fonctions dans postgreSQL, il faut les transformer en objet dynamique. En supposant que les fonctions se trouvent dans le fichier complex.c, la commande compilation est On charge ensuite le contenu du fichier complex.so sous psql à l'aide des commandes SQL qui suivent: On peut stocker ces commandes dans un fichier complex.sql et dire à psql d'interpréter le contenu du fichier avec Vérifions le contenu de la table test_complex. Utilisons la fonction complex_add() et l'opérateur + pour les nombres complexes.

L'API en langage C, libpq

La distribution de postgreSQL comprend une librairie qui permet d'écrire des programmes C qui dialoguent avec le serveur. Voici un exemple de programme qui affiche le contenu de la table test_complex de la base mabase. 3 Supposons que le programme ci-dessus se trouve dans le fichier acces.c. A la compilation, il doit être lié avec la libraire /usr/lib/libpq.so. La commande correspondante est L'exécution donne

L'interface avec Tcl/Tk

Il est possible de réaliser des interfaces graphiques sous Xwindow pour postgreSQL en utilisant Tcl/Tk. Pour cela, il est nécessaire de se procurer les sources de postgreSQL 6.2.1. Elles sont disponibles à ftp://ftp.postgresql.org/pub/oldstuff/postgresql-6.2.1.tar.gz. Les sources permettent de construire une librairie libpgtcl contenant des commandes qui permettent d'utiliser postgreSQL à partir de Tcl et deux interpréteurs pgtclsh et pktksh qui sont versions des interpréteurs tclsh et wish intégrant les commandes de libpgtcl. La procédure d'installation comprend plusieurs étapes. Elle est donnée en annexe.

Voici un exemple de programme Tcl/TK qui ouvre une fenêtre dans laquelle un bouton lance la commande select *from test_complex; et dont le résultat de la requête s'affiche dans la fenêtre.

Supposons que le programme se trouve dans le fichier mabase.tcl. Pour l'exécuter, on peut le rendre exétable et le lancer directement. On peut aussi invoquer l'interpréteur pgtksh. Dans les deux cas, une fenêtre s'ouvre et lorsqu'on clique sur le bouton select * from test_complex, on voit

La connexion JDBC

On trouve aussi dans les fichiers sources, des sources Java qui permettent de réaliser des connexions à postgreSQL en utilisant le protocole Java DataBase Connectivity. Il faut disposer d'une version du Java Development Kit 1.1. Une procédure d'installation de ce dernier à partir du cdrom est décrite dans un autre article du présent volume. Pour cela, il est également nécessaire de se procurer les sources de postgreSQL disponibles à ftp://ftp.postgresql.org/pub/oldstuff/postgresql-6.2.1.tar.gz. Elles permettent de construire une librairie de classes postgresql.jar qui réalisent l'interface entre postgreSQL et le package java.sql du JDK. Pour construire cette librairie, la séquence de commandes est Vous pouvez donner les réponses par défaut aux questions posées par ce programme. Cette commande doit avoir créé le fichier postgresql.jar.

Pour terminer l'installation, l'utilisateur root peut recopier le fichier postgresql.jar et le répertoire postgresql dans le répertoire /usr/lib/jdk1.1.5/classes avec

Pour tester l'installation, on peut éditer le fichier JDBC_Test.java et remplacer à la ligne 31 la chaîne de caractères "adrian" par un nom d'utilisateur habilité à utiliser mabase, soit "pierre" dans notre session. On compile JDBC_Test.java avec L'exécution du programme donne L'inconvénient de ce programme est qu'il ne laisse pas de trace dans la base de données. Voici une adaptation de ce programme qui ajoute une entrée dans la table test_complex. Pour le tester, il faut que le programme ci-dessus se trouve dans un fichier appelé piebase.java. Ce fichier peut se trouver n'importe où si JDK les postgresql.jar et postgreql se trouvent dans /usr/lib/jdk-1.1.5/classes. Sinon, il faut créer ce fichier dans postgresql-6.2.1/src/interfaces/jdbc. On lance ensuite On peut alors vérifier l'état de la table test_complex sous psql.

La documentation

Elle se trouve dans l'arborescence de fichiers dont la racine est le répertoire /usr/doc/postgresql-6.2.1/. Elle contient en particulier

Plusieurs pages de manuel sont accessibles avec la commande man. Essayez par exemple man postmaster, man pgintro, man psql, ...

Quelques adresses sur le Web


1 Le système postgreSQL fait partie de la Redhat 5.0.

2 Signalons que la chaîne de caractères \g qui indique la fin d'une commande est plus robuste que le point virgule qui n'est pas toujours interprété par psql.

3 Ce programme se contente de récupérer les champs de chaque tuple sous forme de chaîne de caractères, mais il est aussi tout à fait possible de les obtenir directement en binaire en définissant un BINARY CURSOR. Des exemples de tels programmes sont présentés dans le manuel de postgreSQL.


Annexe : Installation de l'interface avec Tcl/Tk

Voici les commandes à exécuter. Vous pouvez donner les réponses par défaut aux questions posées par ce programme. Cette commande a pour résultat la création de la librairie libpgtcl.so.1. L'utilisateur root doit ensuite effectuer Puis il faut construire les interpréteurs pgtclsh et pgtksh. L'utilisateur qui conduit l'installation doit se placer dans postgresql-6.2.1/src/, éditer le fichier Makefile.global et remplacer respectivement les chaînes de caractères tcl7.5 par tcl8.0, tk4.1 par tk8.0 et X11_LIBDIR= /usr/lib par X11_LIBDIR= /usr/X386/lib. Ensuite il faut faire Les deux interpréteurs doivent alors se trouver dans dans le répertoire courant postgresql-6.2.1/src/bin/pgtclsh. L'utilisateur root peut les recopier dans le répertoire /usr/bin avec