PostgreSQL et les bases template
posté le 12 janvier 2022
Lors de l'initialisation des données effectué après l'installation, un cluster PostgreSQL possède deux bases template : template0 et template1.
Lors de la création d'une nouvelle base de données, PostgreSQL se sert du contenu d'une des deux base template pour créer la nouvelle base. Par défaut, c'est la template1 qui est utilisée.
Cette base de données est le « modèle » à partir duquel de nouvelles bases de données sont créées. Si vous ajoutez des objets à template1, ces objets seront copiés dans les bases de données utilisateur créées ultérieurement.
Ce comportement permet d'apporter des modifications locales au jeu standard d'objets des bases de données. Par exemple, si vous installez le langage de procédures PL/Perl dans template1, celui-ci sera automatiquement disponible dans les bases de données utilisateur sans qu'il soit nécessaire de faire quelque chose de spécial au moment où ces bases de données sont créées.
Donc lorsque l'on saisie la commande suivante :
CREATE DATABASE nom_base;
ceci est équivalent à :
CREATE DATABASE nom_base TEMPLATE template1;
Cette template contient seulement les objets standards prédéfinis dans votre version de PostgreSQL. template0 ne devrait jamais être modifiée après que le cluster des bases de données ait été créé.
En indiquant à CREATE DATABASE de copier template0 au lieu de template1, vous pouvez créer une base de données utilisateur « vierge » (une base où aucun objet défini par un utilisateur n'existe et où les objets systèmes n'ont pas été modifiés) qui ne contient aucun des ajouts locaux à template1.
Ceci est particulièrement pratique quand on restaure une sauvegarde réalisé avec pg_dump : le script de dump devrait être restauré dans une base de données vierge pour être sûr de recréer le contenu correct de la base de données sauvegardée, sans aucun conflit avec des objets qui auraient été ajoutés à template1.
Pour créer une base vierge, a partir de la template template0 on utilise la syntaxe suivante :
CREATE DATABASE nom_base TEMPLATE template0;