PostgreSQL 9.2.8を使用して、あるデータベースのデータを別のデータベースに復元しようとしていますが、引き続きトリガが実行されているようです。コピーを行うために、以下に示すスクリプトを書いた。pg_restoreがトリガを無効にしていません
基本的に私の生産データベースにはdts
があり、開発データベースにはDigitalTrafficSystem
があります。テーブルの構造は同じですが、devには非常に異なるストアドプロシージャがあります。
リストアを実行すると、DigitalTrafficSystem
データベースにはdts
データベースに存在しないテーブル行が余分に残ってしまいます。そのため、トリガーによって作成されていると仮定しています。
私は、トリガーに関連する取得のメッセージは、各テーブルのために、そのように見える:
pg_restore: [archiver (db)] could not execute query: ERROR: permission denied: "RI_ConstraintTrigger_c_136691" is a system trigger
Command was: ALTER TABLE usage ENABLE TRIGGER ALL;
私はトリガーがオフになっていることを仮定しているが、ちょうどそのシステム・レベルのトリガはできなかった(誤って?)無効になります。トリガがオフになっているが、ちょうどその システム・レベルのトリガが無効に得ることができなかったことを
#!/bin/sh
PGUSER=dts
FILE=/tmp/.dts.db.$$
# Dump the schema of the DB as we want this to keep
pg_dump -s DigitalTrafficSystem -f $FILE
dropdb -U _postgres DigitalTrafficSystem
if [ $? -ne 0 ]; then
exit;
fi
createdb -U _postgres -O dts DigitalTrafficSystem
if [ $? -ne 0 ]; then
exit;
fi
# Restore the schema
psql -d DigitalTrafficSystem -f $FILE
# Dump the data of the real production database
pg_dump -Fc -a dts -f $FILE > /dev/null
if [ $? -ne 0 ]; then
exit;
fi
# Restore only the data from the real database to our development one
pg_restore -a -d DigitalTrafficSystem --disable-triggers -S dts $FILE
rm $FILE
これは間違いなくトリガーです。最後のpg_restoreを実行してデータベースを開き、すべてのトリガを手動で削除してから、pg_restoreコマンドを実行したところ、無効なデータが表示されませんでした。データベースを書き直すたびに手動で行うことはできません。 – Gargoyle
空のデータベース(新しく作成され、テーブルを含まない)に--data-onlyリストアを実行しようとしているようですが、テーブル定義もターゲットDBに必要ですが、存在しないテーブル。 – wildplasser
何らかの理由で、 'psql -d DigitalTrafficSystem -f $ FILE'でコピーできませんでした。データベースが作成された後に実行され、ダンプされたスキーマに基づいてリストアされます。 – Gargoyle