5 Extensions PostgreSQL pour l’utilisateur
Extensions PostgreSQL pour l’utilisateur

Qu’est-ce qu’une extension ?
- Pour ajouter :
- types de données
- méthodes d’indexation
- fonctions et opérateurs
- tables, vues…
- Tous sujets, tous publics
- Intégrées (« contribs ») ou projets externes
Les extensions sont un gros point fort de PostgreSQL. Elles permettent de rajouter des fonctionnalités, aussi bien pour les utilisateurs que pour les administrateurs, sur tous les sujets : fonctions utilitaires, types supplémentaires, outils d’administration avancés, voire applications quasi-complètes. Certaines sont intégrées par le projet, mais n’importe qui peut en proposer et en intégrer une.
Administration des extensions
Techniquement :
- « packages » pour PostgreSQL, en C, SQL, PL/pgSQL…
- Langages : SQL, PL/pgSQL, C (!)…
- Ensemble d’objets livrés ensemble
- contrib <> extension
Une extension est un objet du catalogue, englobant d’autres objets. On peut la comparer à un paquetage Linux.
Une extension peut provenir d’un projet séparé de PostgreSQL (PostGIS, par exemple, ou le Foreign Data Wrapper Oracle).
Les extensions les plus simples peuvent se limiter à quelques objets en SQL, certaines sont en PL/pgSQL, beaucoup sont en C. Dans ce dernier cas, il faut être conscient que la stabilité du serveur est encore plus en jeu !
Installation des extensions
- Packagées ou à compiler
- Par base :
CREATE EXTENSION … CASCADEALTER EXTENSION UPDATEDROP EXTENSION\dx
- Listées dans
pg_available_extensions
Au niveau du système d’exploitation, une extension nécessite des objets (binaires, scripts…) dans l’arborescence de PostgreSQL. De nombreuses extensions sont déjà fournies sous forme de paquets dans les distributions courantes ou par le PGDG, ou encore l’outil PGXN. Dans certains cas, il faudra aller sur le site du projet et l’installer soi-même, ce qui peut nécessiter une compilation.
L’extension doit être ensuite déclarée dans chaque base où elle est jugée nécessaire avec CREATE EXTENSION nom_extension. Les scripts fournis avec l’extension vont alors créer les objets nécessaires (vues, procédures, tables…). En cas de désinstallation avec DROP EXTENSION, ils seront supprimés. Une extension peut avoir besoin d’autres extensions : l’option CASCADE permet de les installer automatiquement.
Le mécanisme couvre aussi la mise à jour des extensions : ALTER EXTENSION UPDATE permet de mettre à jour une extension dans PostgreSQL suite à la mise à jour de ses binaires. Cela peut être nécessaire si elle contient des tables à mettre à jour, par exemple. Les versions des extensions disponibles sur le système et celles installées dans la base en cours sont visibles dans la vue pg_available_extensions.
Les extensions peuvent être exportées et importées par pg_dump/pg_restore. Un export par pg_dump contient un CREATE EXTENSION nom_extension, ce qui permettra de recréer d’éventuelles tables, et le contenu de ces tables. Une mise à jour de version majeure, par exemple, permettra donc de migrer les extensions dans leur dernière version installée sur le serveur (changement de prototypes de fonctions, nouvelles vues, etc.).
Sous psql, les extensions présentes dans la base sont visibles avec \dx :
Contribs - Fonctionnalités
- Livrées avec le code source de PostgreSQL
- Habituellement packagées (
postgresql-*-contrib) - De qualité garantie car maintenues par le projet
- Optionnelles, désactivées par défaut
- Ou en cours de stabilisation
- Documentées : https://docs.postgresql.fr/current/contrib.html
Une « contrib » est habituellement une extension, sauf quelques exceptions qui ne créent pas d’objets de catalogue (auto_explain par exemple). Elles sont fournies directement dans l’arborescence de PostgreSQL, et suivent donc strictement son rythme de révision. Leur compatibilité est ainsi garantie. Les distributions les proposent parfois dans des paquets séparés (postgresql-contrib-9.6, postgresql14-contrib…), dont l’installation est fortement conseillée.
Il s’agit soit de fonctionnalités qui n’intéressent pas tout le monde (hstore, uuid, pg_trgm, pgstattuple…), ou en cours de stabilisation (comme l’autovacuum avant PostgreSQL 8.1), ou à l’inverse de dépréciation (xml2).
La documentation des contribs est dans le chapitre F des annexes, et est donc fréquemment oubliée par les nouveaux utilisateurs.
Quelques extensions
…plus ou moins connues
pgcrypto
Module contrib de chiffrement :
- Nombreuses fonctions pour chiffrer et déchiffrer des données
- Gros inconvénient : oubliez les index sur les données chiffrées !
- N’oubliez pas de chiffrer la connexion (SSL)
- Permet d’avoir une seule méthode de chiffrement pour tout ce qui accède à la base
Fourni avec PostgreSQL, vous permet de chiffrer vos données :
- directement ;
- avec une clé PGP (gérée par exemple avec GnuPG), ce qui est préférable ;
- selon divers algorithmes courants ;
- différemment selon chaque ligne/champ.
Voici un exemple de code:
L’appel à gen_salt permet de rajouter une partie aléatoire à la chaîne à chiffrer, ce qui évite que la même chaîne chiffrée deux fois retourne le même résultat. Cela limite donc les attaques par dictionnaire.
La base effectuant le (dé)chiffrement, cela évite certains allers-retours. Il est préférable que la clé de déchiffrement ne soit pas dans l’instance, et soit connue et fournie par l’applicatif. La communication avec cet applicatif doit être sécurisée par SSL pour que les clés et données ne transitent pas en clair.
Un gros inconvénient de chiffrer les données dans la table est l’impossibilité complète de les indexer, même avec un index fonctionnel : en effet, les données déchiffrées seraient en clair dans cet index ! Une recherche implique donc de parcourir et déchiffrer chaque ligne.
Pour aller plus loin : https://dali.bo/kb_pgcrypto
hstore : stockage clé/valeur
- Contrib
- Type
hstore - Stockage clé-valeur
- Plus simple que JSON
hstore fournit un type très simple pour stocker des clés/valeurs :
Cette extension a rendu, et rend encore, bien des services. Cependant le type JSON (avec le type binaire jsonb) est généralement préféré.
PostgreSQL Anonymizer
- Extension externe (Dalibo)
- Masquage statique et dynamique
- Export anonyme (
pg_dump_anon) - Les règles de masquage sont écrites en SQL
- Autodétection de colonnes identifiantes
- Plus simple et plus sûr qu’un ETL
Postgresql Anonymizer est une extension pour masquer ou remplacer les données personnelles dans une base PostgreSQL. Elle est développée par Damien Clochard de Dalibo.
Le projet fonctionne selon une approche déclarative, c’est à dire que les règles de masquage sont déclarées directement dans le modèle de données avec des ordres DDL.
Une fois que les règles de masquage sont définies, on peut accéder aux données masquées de 3 façons différentes :
- export anonyme : extraire les données masquées dans un fichier SQL ;
- masquage statique : supprimer une fois pour toutes les données personnelles ;
- masquage dynamique : cacher les données personnelles seulement pour les utilisateurs masqués.
Par ailleurs, l’extension fournit toute une gamme de fonctions de masquage : randomisation, génération de données factices, destruction partielle, brassage, ajout de bruit, etc. On peut également écrire ses propres fonctions de masquage !
Au-delà du masquage, il est également possible d’utiliser une autre approche appelée généralisation qui est bien adaptée pour les statistiques et l’analyse de données.
Enfin, l’extension offre un panel de fonctions de détection qui tentent de deviner quelles colonnes doivent être anonymisées.
Un module de formation lui est consacré.
Exemple :
Étape 1 : activer le masquage dynamique
Étape 2 : déclarer un utilisateur masqué
Étape 3 : déclarer les règles de masquage
Étape 4 : se connecter avec l’utilisateur masqué
PostGIS

- Projet indépendant, GPL, https://postgis.net/
- Module spatial pour PostgreSQL
- Extension pour types géométriques/géographiques & outils
- La référence des bases de données spatiales
- « quelles sont les routes qui coupent le Rhône ? »
- « quelles sont les villes adjacentes à Toulouse ? »
- « quels sont les restaurants situés à moins de 3 km de la Nationale 12 ? »
PostGIS ajoute le support d’objets géographiques à PostgreSQL. C’est un projet totalement indépendant développé par la société Refractions Research sous licence GPL, soutenu par une communauté active, utilisé par des spécialistes du domaine géospatial (IGN, BRGM, AirBNB, Mappy, Openstreetmap, Agence de l’eau…), mais qui peut convenir pour des projets plus modestes.
Techniquement, c’est une extension transformant PostgreSQL en serveur de données spatiales, qui sera utilisé par un Système d’Information Géographique (SIG), tout comme le SDE de la société ESRI ou bien l’extension Oracle Spatial. PostGIS se conforme aux directives du consortium OpenGIS et a été certifié par cet organisme comme tel, ce qui est la garantie du respect des standards par PostGIS.
PostGIS permet d’écrire des requêtes de ce type :
PostGIS fournit les fonctions d’indexation qui permettent d’accéder rapidement aux objets géométriques, au moyen d’index GiST. La requête ci-dessus n’a évidemment pas besoin de parcourir tous les restaurants à la recherche de ceux correspondant aux critères de recherche.
La liste des fonctionnalités comprend le support des coordonnées géodésiques ; des projections et reprojections dans divers systèmes de coordonnées locaux (Lambert93 en France par exemple) ; des opérateurs d’analyse géométrique (enveloppe convexe, simplification…)
PostGIS est intégré aux principaux serveurs de carte, ETL, et outils de manipulation.
La version 3.0 apporte la gestion du parallélisme, un meilleur support de l’indexation SP-GiST et GiST, ainsi qu’un meilleur support du type GeoJSON.
Mais encore…
- uuid-ossp : gérer des UUID
- unaccent : supprime des accents
Autres extensions connues
- Compatibilité :
- orafce
- Extensions propriétaires évitant un fork :
- Citus (sharding)
- TimescaleDB (time series)
- être sûr que PostgreSQL a atteint ses limites !
Les extensions permettent de diffuser des bibliothèques de fonction pour la compatibilité avec du code d’autres produits : orafce est un exemple bien connu.
Pour éviter de maintenir un fork complet de PostgreSQL, certains éditeurs offrent leur produit sous forme d’extension, souvent avec une version communautaire intégrant les principales fonctionnalités. Par exemple :
- Citus permet du sharding ;
- TimescaleDB gère les séries temporelles.
Face à des extensions extérieures, on gardera à l’esprit qu’il s’agit d’un produit supplémentaire à maîtriser et administrer, et l’on cherchera d’abord à tirer le maximum du PostgreSQL officiel.
Extensions pour de nouveaux langages
- PL/pgSQL par défaut
- Ajouter des langages :
- PL/python
- PL/perl
- PL/lua
- PL/sh
- PL/R
- PL/Java
- etc.
SQL et PL/pgSQL ne sont pas les seuls langages utilisables au niveau d’un serveur PostgreSQL. PL/pgSQL est installé par défaut en tant qu’extension. Il est possible de rajouter les langages python, perl, R, etc. et de coder des fonctions dans ces langages. Ces langages ne sont pas fournis par l’installation standard de PostgreSQL. Une installation via les paquets du système d’exploitation est sans doute le plus simple.
Accès distants
Accès à des bases distantes
- Contribs :
- dblink (ancien)
- les foreign data wrappers : postgresql_fdw, mysql_fdw…
- Sharding :
- PL/Proxy
- Citus
Les accès distants à d’autres bases de données sont généralement disponibles par des extensions. L’extension dblink permet d’accéder à une autre instance PostgreSQL mais elle est ancienne, et l’on préférera le foreign data wrapper postgresql_fdw, disponible dans les contribs. D’autres FDW sont des projets extérieurs : ora_fdw, mysql_fdw, etc.
Une solution de sharding n’est pas encore intégrée à PostgreSQL mais des outils existent : PL/Proxy fournit des fonctions pour répartir des accès mais implique de refondre le code. Citus est une extension plus récente et plus transparente.
Contribs orientés DBA
Accès à des informations ou des fonctions de bas niveau :
- pg_prewarm : sauvegarde & restauration de l’état du cache de la base
- pg_buffercache : état du cache
- pgstattuple (fragmentation des tables et index), pg_freespacemap (blocs libres), pg_visibility (visibility map)
- pageinspect : inspection du contenu d’une page
- pgrowlocks : informations détaillées sur les enregistrements verrouillés
- pg_stat_statements (requêtes normalisées), auto_explain (plans)
- amcheck : validation des index
- … et de nombreux projets externes
Tous ces modules permettent de manipuler une facette de PostgreSQL à laquelle on n’a normalement pas accès. Leur utilisation est parfois très spécialisée et pointue.
En plus des contribs listés ci-dessus, de nombreux projets externes existent : toastinfo, pg_stat_kcache, pg_qualstats, PoWa, pg_wait_sampling, hypopg…
Pour plus de détails, consulter les modules X2 et X3.
PGXN
PostgreSQL eXtension Network :
- https://pgxn.org/
- nombreuses extensions
- volontariat
- aucune garantie de qualité
- tests soigneux requis
- Et optionnellement client en python pour automatisation de déploiement
- Ancêtre : pgFoundry
- Beaucoup de projets sont aussi sur github
Le site PGXN fournit une vitrine à de nombreux projets gravitant autour de PostgreSQL.
PGXN a de nombreux avantages, dont celui de demander aux projets participants de respecter un certain cahier des charges permettant l’installation automatisée des modules hébergés. Ceci peut par exemple être réalisé avec le client pgxn fourni :
Pour peu que le Instant Client d’Oracle soit installé, on peut par exemple lancer :
Attention : le fait qu’un projet soit hébergé sur PGXN n’est absolument pas une validation de la part du projet PostgreSQL. De nombreux projets hébergés sur PGXN sont encore en phase de développement, voire abandonnés. Il faut avoir le même recul que pour n’importe quel autre brique libre.
Créer son extension
- Pas si compliqué
- Peut-être juste quelques fonctions SQL
- Référence : documentation, Empaqueter des objets dans une extension
- Exemples SQL et C : blog Dalibo
Il n’est pas très compliqué de créer sa propre extension pour diffuser aisément des outils. Elle peut se limiter à des fonctions en SQL ou PL/pgSQL. Le versionnement des extensions et la facilité de mise à jour peuvent être extrêmement utiles.
Deux exemples de création de fonctions en SQL ou C sont disponibles sur le blog Dalibo. Un autre billet de blog présente une extension utilisable pour l’archivage.
La référence reste évidemment la documentation de PostgreSQL, chapitre Empaqueter des objets dans une extension.
Conclusion
- Un nombre toujours plus important d’extension pour étendre les possibilités de PostgreSQL
- Un site central pour les extensions : PGXN.org
- Rajoutez les vôtres !
Cette possibilité d’étendre les fonctionnalités de PostgreSQL est vraiment un atout majeur du projet PostgreSQL. Cela permet de tester des fonctionnalités sans avoir à toucher au moteur de PostgreSQL et risquer des états instables.
Une fois l’extension mature, elle peut être intégrée directement dans le code de PostgreSQL si elle est considérée utile au moteur.
N’hésitez pas à créer vos propres extensions et à les diffuser !
Questions
N’hésitez pas, c’est le moment !
Travaux pratiques
La version en ligne des solutions de ces TP est disponible sur https://dali.bo/x1_solutions.
Masquage statique de données avec PostgreSQL Anonymizer
But : Découverte de l’extension PostgreSQL Anonymizer et du masquage statique
Installer l’extension PostgreSQL Anonymizer en suivant la procédure décrite sur la page Installation de la documentation.
Créer une table
customer:
Ajouter des individus dans la table :
Lire la documentation sur comment déclarer une règle de masquage et placer une règle pour générer un faux nom de famille sur la colonne
lastname. \ Déclarer une règle de masquage statique sur la colonnelastnameet l’appliquer. \ Vérifier le contenu de la table.
Réappliquer le masquage statique. Qu’observez-vous ?
Masquage dynamique de données avec PostgreSQL Anonymizer
But : Mettre en place un masquage dynamique avec PostgreSQL Anonymizer
Parcourir la liste des fonctions de masquage et écrire une règle pour cacher partiellement le numéro de téléphone. \ Activer le masquage dynamique. \ Appliquer le masquage dynamique uniquement sur la colonne
phonepour un nouvel utilisateur nommé soustraitant.
Travaux pratiques (solutions)
Masquage statique de données avec PostgreSQL Anonymizer
Installer l’extension PostgreSQL Anonymizer en suivant la procédure décrite sur la page Installation de la documentation.
Sur Rocky Linux ou autre dérivé Red Hat, depuis les dépôts du PGDG :
Au besoin, remplacer 14 par la version de l’instance PostgreSQL.
La base de travail ici se nomme sensible. Se connecter à l’instance pour initialiser l’extension :
Après reconnexion à la base sensible :
Créer une table
customer:
Ajouter des individus dans la table :
Lire la documentation sur comment déclarer une règle de masquage et placer une règle pour générer un faux nom de famille sur la colonne
lastname. \ Déclarer une règle de masquage statique sur la colonnelastnameet l’appliquer. \ Vérifier le contenu de la table.
Si on consulte la table avec :
les données ne sont pas encore masquées car la règle n’est pas appliquée. L’application se fait avec :
NB : les données de la table ont ici bien été modifiées sur le disque.
Réappliquer le masquage statique. Qu’observez-vous ?
Si l’on relance l’anonymisation plusieurs fois, les données factices vont changer car la fonction fake_last_name() renvoie des valeurs différentes à chaque appel.
Masquage dynamique de données avec PostgreSQL Anonymizer
Parcourir la liste des fonctions de masquage et écrire une règle pour cacher partiellement le numéro de téléphone. \ Activer le masquage dynamique. \ Appliquer le masquage dynamique uniquement sur la colonne
phonepour un nouvel utilisateur nommé soustraitant.
Les numéros de téléphone apparaissent encore car ils ne sont pas masqués à l’utilisateur en cours. Il faut le déclarer pour les utilisateurs concernés :
Ce nouvel utilisateur verra à chaque fois des noms différents (masquage dynamique), et des numéros de téléphone partiellement masqués :
Pour consulter la configuration de masquage en place, utiliser une des vues fournies dans le schéma anon :
Navigation
Pour revenir au chapitre précédent, voir le chapitre précédent. Pour poursuivre la lecture, voir le chapitre suivant.