En fait, CREATE DATABASE
fonctionne en copiant une base
de données préexistante. Par défaut, cette commande copie la base
de données système standard
template1
. Ainsi,
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.
Néanmoins, CREATE DATABASE
ne copie pas les droits
GRANT
au niveau base de données, attachés à la base
source. La nouvelle base de données a les droits par défaut au niveau base.
Il y a une seconde base de données système standard appelée
template0
. Cette
base de données contient les mêmes données que le contenu initial
de template1
, c'est-à-dire 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 » 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 survenue de conflits avec des objets qui
auraient été ajoutés à template1
.
Une autre raison habituelle de copier template0
au lieu
de template1
est que les nouvelles options d'encodage et
de locale peuvent être indiquées lors de la copie de template0
,
alors qu'une copie de template1
doit utiliser les même
options. Ceci est dû au fait que template1
pourrait
contenir des données spécifiques à l'encodage ou à la locale alors que
template0
n'est pas modifiable.
Pour créer une base de données à partir de
template0
, on écrit :
CREATE DATABASE nom_base
TEMPLATE template0;
dans l'environnement SQL ou
createdb -T template0 nom_base
dans le shell.
Il est possible de créer des bases de données modèles
supplémentaires et, à vrai dire, on peut copier n'importe quelle
base de données d'un cluster en la désignant comme modèle pour la
commande CREATE DATABASE
. Cependant, il importe de
comprendre, que ceci n'est pas (encore) à prendre comme une commande
« COPY DATABASE
» de portée
générale.
La principale limitation est qu'aucune autre session ne peut être connectée
à la base source tant qu'elle est copiée. CREATE
DATABASE
échouera si une autre connexion existe à son lancement.
Lors de l'opération de copie, les nouvelles connexions à la base source sont
empêchées.
Deux drapeaux utiles existent dans
pg_database
pour chaque base de données : les colonnes
datistemplate
et
datallowconn
. datistemplate
peut être positionné à vrai pour indiquer qu'une base de données a
vocation à servir de modèle à CREATE DATABASE
. Si ce
drapeau est positionné à vrai, la base de données peut être clonée
par tout utilisateur ayant le droit CREATEDB
; s'il est
positionné à faux, seuls les super-utilisateurs et le propriétaire
de la base de données peuvent la cloner. Si
datallowconn
est positionné à faux, alors aucune
nouvelle connexion à cette base de données n'est autorisée (mais
les sessions existantes ne sont pas terminées simplement en
positionnant ce drapeau à faux). La base de données
template0
est normalement marquée
datallowconn = false
pour empêcher qu'elle ne soit
modifiée. Aussi bien template0
que
template1
devraient toujours être marquées
datistemplate = true
.
template1
et template0
n'ont pas de
statut particulier en dehors du fait que template1
est la base de données source par défaut pour la commande
CREATE DATABASE
. Par exemple, on pourrait supprimer
template1
et la recréer à partir de
template0
sans effet secondaire gênant. Ce procédé
peut être utile lorsqu'on a encombré template1
d'objets inutiles. (Pour supprimer template1
, cette
dernière doit avoir le statut pg_database.datistemplate
à
false
.
La base de données postgres
est aussi créé quand le groupe est
initialisé. Cette base de données a pour but de devenir une base de données
par défaut pour la connexion des utilisateurs et applications. C'est une
simple copie de template1
et peut être supprimée et re-créée
si nécessaire.