テーブルの「レガシー」データを更新するために、短いスクリプトでいくつかのテストを実行する必要がありました。
私は慎重で、テストされていないスクリプトを使用して、その前に関連テーブルをバックアップすることにしました。これを行う最も簡単な方法は次のとおりです。
pg_dump -a --file table.sql -t table database
今、私は自分がしなければならないことをし、結果を確認しましたが、それらはかなり満足のいくものではありませんでした。私は自分自身に考えました。そのテーブルのバックアップを作成することは、どれほど幸運かです。
私がテーブルをバックアップしたとき、私はすでに警告されていました:
pg_dump: NOTICE: there are circular foreign-key constraints among these table(s):
pg_dump: table
pg_dump: You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints.
pg_dump: Consider using a full dump instead of a --data-only dump to avoid this problem.
あまり考えませんでしたが、今問題があります。実際、問題のテーブルには複数のトリガーがアタッチされていtable.sql
ます--disable-triggers
が、pg_restoreコマンドのwithオプションを復元できません。
次のコマンドを実行すると、エラーメッセージが表示されます。
pg_restore -a -d database -t table -h localhost --disable-triggers table.sql
つまり:
pg_restore: [archiver] input file appears to be a text format dump. Please use psql.
psql
と同じ動作を示す-コマンドのフラグはあり--disable-triggers
ますか?
私はすでにpsqlの「manpage」をチェックして、トリガーおよび類似のキーワードを検索しましたが、何も見つかりませんでした。
それとも、データを復元する前にテーブルのトリガーを削除する必要がある唯一のオプションですか?
サイドノート:Ubuntu 14.10システムでpostgres v。9.3を使用しています
次のステートメントを含めるために、生成されたsqlファイルを編集することが提案されました。
ALTER TABLE table DISABLE TRIGGER ALL
今実行すると:psql -d database -f table.sql
主キーの「一意の」制約違反に関するエラーメッセージが表示されました。
これを修正するために、コピーを次のようにラップしようとしました:
BEGIN TRANSACTION READ WRITE;
TRUNCATE TABLE table;
-- copy here
COMMIT;
現在、エラーメッセージは次のとおりです。
psql:project_backup.sql:18: ERROR: cannot truncate a table referenced in a foreign key constraint
DETAIL: Table "another" references "table".
HINT: Truncate table "another" at the same time, or use TRUNCATE ... CASCADE.
psql:project_backup.sql:20: ERROR: current transaction is aborted, commands ignored until end of transaction block
psql:project_backup.sql:21: invalid command \N
psql:project_backup.sql:22: invalid command \N
後者の警告は\N
、ダンプ内の(null値を表す)それぞれに対して繰り返されます。
BEGIN TRANSACTION READ WRITE; TRUNCATE TABLE table;
データを保護するために続行すると、無効なコマンドに関するメッセージが表示されます:(
COPY
を追加ALTER TABLE table DISABLE TRIGGER ALL
し、最後にこれらを再度有効にします。