テンプレートデータベース

PostgreSQL 8.4.1文書
前のページ | 巻戻し | 第 21章データベース管理 | 早送り | 次のページ

# 21.3. テンプレートデータベース

実際の`CREATE DATABASE`の動作は、既存のデータベースをコピーすることです。 デフォルトでは、`template1`という名前の標準のシステムデータベースをコピーします。 したがって、このデータベースは新しく作成するデータベースの元になる"テンプレート"となります。 `template1`にオブジェクトを追加した場合、追加したオブジェクトはその後に作成されるユーザデータベースにコピーされます。 この振舞いによって、データベース標準オブジェクト群にサイト独自の変更を行うことができます。 例えば、PL/pgSQL手続き言語を`template1`にインストールした場合、データベースを作成する時に追加操作を行うことなく、自動的にこの言語をユーザデータベースで使用することができます。

`template0`という名前の二次的な標準システムデータベースがあります。 このデータベースには`template1`の初期内容と同じデータが含まれています。 つまり、使用しているバージョンのPostgreSQLで定義済みの標準オブジェクトのみから構成されています。 `template0`を`initdb`実行後に変更してはいけません。 `CREATE DATABASE`を`template1`ではなく`template0`をコピーするように実行することで、`template1`に追加されたサイト独自のものを含まない、"汚れがない"ユーザデータベースを作成することができます。 これは特に、`pg_dump`ダンプからリストアする時に便利です。 このダンプスクリプトは、後で`template1`に追加される可能性のあるオブジェクトと衝突しないように、ダンプしたデータベースの内容を正しく再作成するために、汚れのないデータベースにリストアされなければなりません。

`template1`の代わりに`template0`を複写するその他の共通した理由は、`template0`を複写するときに新規の符号化方式とロケールを設定できることです。一方、`template1`の複写はそれが行ったと同一の設定を使用しなければなりません。これは`template0`が理解しない符号化方式特有の、またはロケール特有のデータを含んでいる可能性があることに依ります。

`template0`をコピーしてデータベースを作成するには、

    CREATE DATABASE dbname TEMPLATE template0;

をSQL環境から実行するか、または

    createdb -T template0 dbname

をシェルから実行します。

さらにテンプレートデータベースを作成することができます。 また、実際のところ`CREATE DATABASE`のテンプレートとして名前を指定することで、クラスタ内の任意のデータベースをコピーすることができます。 しかし、この機能は、（まだ）汎用目的の"`COPY DATABASE`"能力を意図したものではないことは理解しておいてください。 コピー操作の間、他のセッションから元のデータベースに接続することができないという点が大きな制限です。 `CREATE DATABASE`は、その起動時に他の接続が存在する場合失敗します。 さらに、`CREATE DATABASE`が終わるまで、元のデータベースへの新しい接続はロックされます。

`datistemplate`列と`datallowconn`列という、データベースそれぞれに有用なフラグが`pg_database`に存在します。 `datistemplate`は、そのデータベースが`CREATE DATABASE`のテンプレートとして使用されることを目的としているものであることを意味するために設定することができます。 このフラグが設定された場合、`CREATEDB`権限を持つ全てのユーザはそのデータベースを複製することができます。 設定されていない場合は、スーパーユーザとそのデータベース所有者のみがそれを複製することができます。 `datallowconn`が偽の場合、そのデータベースへの新規接続はできません（しかし、このフラグを偽にするだけでは既存のセッションは閉ざされません）。 `template0`データベースは、変更を防ぐために、通常`datallowconn` = `false`とされています。 `template0`と`template1`の両方は、常に`datistemplate` = `true`とされていなければなりません。

> 注意: `template1`と`template0`には、`template1`という名前が`CREATE DATABASE`のデフォルトのソースデータベースの名前であること以上の特別な地位はありません。 例えば、`template1`を削除し、`template0`から再作成しても何も問題ありません。 この操作は、不注意にごみを`template1`に追加してしまった場合にお勧めします。 （`template1`を削除するには、`pg_database.datistemplate = false`としなければなりません。）

> データベースクラスタが初期化される時、`postgres`も作成されます。 このデータベースは、ユーザとアプリケーションのデフォルトの接続先を意図したものです。 これは`template1`の単純な複製で、必要に応じて削除したり再作成したりすることができます。

前のページ | ホーム | 次のページ
データベースの作成 | 上に戻る | データベースの設定