無料スクリプト配布のPHP.TO   PHPの実用的なtips PHPマニュアル MySQLマニュアル Apacheマニュアル PostgreSQLマニュアル マニュアル検索    

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

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

template0 という名前の二次的な標準システムデータベースがあります。 このデータベースには template1 の初期内容と同じデータが含まれています。 つまり、使用しているバージョンの PostgreSQL で定義済みの標準オブジェクトのみから構成されています。 template0 をデータベースクラスタを初期化した後に変更してはいけません。 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 は、その起動時に他の接続が存在する場合失敗します。 コピー操作中は元のデータベースへの新しい接続を許しません。

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 の単純なコピーで、必要に応じて削除したり再作成したりすることができます。


powered by SEO.CUG.NET