必要なデータのみを削除したかどうかを確認するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/132070

質問

私は、テーブル間の複雑な関係 (外部キー、削除カスケードなど) を持つ多数のテーブルを含む非常に大きなデータベース (PostgreSQL 上で実行されている) を持っています。いくつかのテーブルからいくつかのデータを削除する必要がありますが、カスケード削除により実際にデータベースから削除されるデータの量がわかりません。

削除すべきではないデータを削除しないことを確認するにはどうすればよいですか?

私はテストデータベースを持っています - やりたいことができる実際のデータベースのコピーです:)

私が持っている唯一のアイデアは、前後のデータベースをダンプして確認することです。しかし、それは快適ではないようです。もう1つのアイデアは、データベースの一部をダンプし、DELETEステートメントの影響を受けないようにして、データの削除の前後にこの部分をチェックすることです。しかし、それを行う簡単な方法はわかりません(数百のテーブルがあり、そのうちの最大10個で削除が機能するはずです)。何か方法はありますか?

問題を解決するための他のアイデアはありますか?

役に立ちましたか?

解決

information_schema をクエリして、データベース内で制約がどのように定義されているかを自分で描くことができます。そうすれば、削除すると何が起こるかがわかります。これは今回の場合に限らず、常に役に立ちます。

(制約の場合) のようなもの

select table_catalog,table_schema,table_name,column_name,rc.* from
information_schema.constraint_column_usage ccu, 
information_schema.referential_constraints rc 
where ccu.constraint_name = rc.constraint_name

他のヒント

psql を使用して、トランザクションを開始し、削除を実行してから、考えられるあらゆるチェック クエリを実行します。その後、ロールバックまたはコミットを行うことができます。

キーがぶら下がったままになっていることが心配な場合 (例:削除されたレコードを指している場合)、テスト データベースで削除を実行し、クエリを使用して無効なターゲットを指しているキーを検索します。(これを行っている間、影響を受けないはずの部分が変更されていないことを確認することもできます)

より良い解決策は、時間をかけて削除カスケードを計画し、何が起こるかを把握することです。データベースがどのように動作するかを知ることは非常に価値があるため、これに費やした労力は、この特定の削除以外にも役立ちます。

また、大きな変更を行う前に DB をバックアップしたことがどれほど確実であっても!

ご回答ありがとうございます!

ヴィンコ、あなたの答えは私にとってとても役に立ちます、私はそれをひしゃくのように勉強します。

実際、私の場合、レコード削除の前後でテーブル数を比較し、どのテーブルが影響を受けたかを確認するだけで十分でした。

以下に説明する簡単なコマンドで実行されました

psql -U U_NAME -h`hostname` -c '\d' | awk '{print $3}' > tables.list

for i in `cat tables.list `; do echo -n "$i: " >> tables.counts; psql -U U_NAME -h`hostname` -t -c "select count(*) from $i" >> tables.counts; done

for i in `cat tables.list `; do echo -n "$i: " >> tables.counts2; psql -U U_NAME -h`hostname` -t -c "select count(*) from $i" >> tables.counts2; done

diff tables.counts tables.counts2
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top