実際の CREATE DATABASE の動作は、既存のデータベースをコピーすることです。デフォルトでは、template1という名前の標準のシステムデータベースをコピーします。従って、このデータベースは新しく作成するデータベースの元になる"テンプレート"となります。template1 にオブジェクトを追加した場合、追加したオブジェクトはその後に作成されるユーザデータベースにコピーされます。この振舞いによって、データベース標準オブジェクト群にサイト独自の変更を行うことができます。例えば、PL/pgSQL 手続き言語を template1 にインストールした場合、データベースを作成する時に追加操作を行うことなく、自動的にこの言語をユーザデータベースで使用することができます。
template0 という名前の二次的な標準システムデータベースがあります。このデータベースには template1 の初期内容と同じデータが含まれています。 つまり、使用しているバージョンの PostgreSQL で定義済みの標準オブジェクトのみから構成されています。 template0 をinitdb 実行後に変更してはいけません。CREATE DATABASE をtemplate1 ではなく template0 をコピーするように実行することで、template1 に追加されたサイト独自のものを含まない、"汚れがない" ユーザデータベースを作成することができます。これは特に、pg_dump ダンプからリストアする時に便利です。このダンプスクリプトは、現時点で template1 に存在する可能性がある追加されたものと衝突しないようにダンプしたデータベースの内容を正しく再作成するために、汚れのないデータベースにリストアされなければなりません。
template0 をコピーしてデータベースを作成するには、
CREATE DATABASE dbname TEMPLATE template0;
を SQL 環境から実行するか、または
createdb -T template0 dbname
をシェルから実行します。
更にテンプレートデータベースを作成することができます。 また、実際のところCREATE DATABASE のテンプレートとして名前を指定することで、インストレーション内の全てのデータベースをコピーすることができます。しかし、この機能は、(まだ)汎用目的の "COPY DATABASE" 能力を意図したものではないことは理解しておいて下さい。特に、コピー操作の間、ソースデータベースが待機状態(実行中のデータ変更トランザクションがない状態)であることが基本です。CREATE DATABASE は、処理を始める時に(自身を除く)バックエンドプロセスがソースデータベースに接続していないことをチェックします。 しかし、コピー先のデータベースの一貫性が失われる結果になる、コピー処理中の変更ができないことを保証しません。従って、テンプレートとして使用するデータベースは読み取りのみとして扱うことを推奨します。
datistemplate 列と datallowconn 列という、データベースそれぞれに有用なフラグが pg_database に存在します。 datistemplate はそのデータベースがCREATE DATABASE のテンプレートとして使用されることを目的としているものであることを意味するために設定される可能性があります。このフラグが設定された場合、CREATEDB 権限を持つ全てのユーザはそのデータベースを複製することができます。設定されていない場合は、スーパユーザとデータベース所有者のみがそれを複製することができます。datallowconn が偽の場合、そのデータベースへの新規接続はできません(しかし、このフラグを偽にするだけでは既存のセッションは閉ざされません)。template0 データベースは、変更を防ぐために、通常 datallowconn = false とされています。template0 と template1 の両方は、常に datistemplate = true とされていなければなりません。
テンプレートデータベースを準備した後、または、テンプレートデータベースに変更を加えた後に、そのデータベースに対して VACUUM FREEZE か VACUUM FULL FREEZE を実行して下さい。そのデータベースを開くトランザクションが存在しない時にこれを実行した場合、データベース内の全てのタプルは"凍結"され、トランザクション周回問題を防ぐことができます。これは特に、datallowconnが偽のデータベースでは重要です。 なぜなら、そのようなデータベースに対して、定常的な VACUUM 保守作業ができないからです。より詳細については Section 8.2.3 を参照して下さい。
Note: template1 と template0 には、template1 という名前が CREATE DATABASE のデフォルトのソースデータベースの名前であること、および、createdb などの各種プログラムのデフォルトの接続データベースであること以上の特別な地位はありません。例えば、template1 を削除し、template0 から再作成しても何も問題ありません。この操作は、不注意にゴミを template1 に追加してしまった場合にお勧めします。