私は私のPostgreSQLデータベースのダンプを取得しました:
pg_dump -U user-name -d db-name -f dumpfile
次に、次のコマンドを使用して別のデータベースに復元します。
psql X -U postgres -d db-name-b -f dumpfile
私の問題は、データベースに参照制約、チェック、トリガーが含まれていることと、これらのチェック(特にチェック)の一部が復元中に失敗することです。たとえば、テーブルへの行の挿入は、他の無関係なテーブルで条件が成立するかどうかをチェックCHECK
するplpgsql
関数を呼び出すに関連付けられます。後者のテーブルがpsql
前者の前に読み込まれない場合、エラーが発生します。
以下は、一度ダンプするpg_dump
と復元できないデータベースを生成するSSCCEです。
CREATE OR REPLACE FUNCTION fail_if_b_empty () RETURNS BOOLEAN AS $$
SELECT EXISTS (SELECT 1 FROM b)
$$ LANGUAGE SQL;
CREATE TABLE IF NOT EXISTS a (
i INTEGER NOT NULL
);
INSERT INTO a(i) VALUES (0),(1);
CREATE TABLE IF NOT EXISTS b (
i INTEGER NOT NULL
);
INSERT INTO b(i) VALUES (0);
ALTER TABLE a ADD CONSTRAINT a_constr_1 CHECK (fail_if_b_empty());
ダンプの復元中にこのような制約をすべて(コマンドラインから)無効にし、後で再び有効にする方法はありますか?PostgreSQL 9.1を実行しています。
CHECK
制約内の他のテーブルを参照する関数を使用する場合、すべての保証は無効になります。しかし、CHECK
制約を宣言するNOT VALID
ことで、あらゆる点で機能しました。私が触れたことがないコーナーケースがあるかもしれません...
-X
には-d
オプションがありませんpg_dump
。pg_dump
ダンプ生成され、空のDBで復元を。