5

外部キーと相互リンクされた数十のテーブルを持つデータベースがあります。通常の状況では、ON DELETE RESTRICTこれらの制約のデフォルトの動作が必要です。しかし、データベースのスナップショットをコンサルタントと共有しようとすると、機密データを削除する必要がありました。私のDELETE FROM Table CASCADE命令の記憶が純粋な幻覚ではなかったらいいのにと思います。

私がやったことは、データベースをダンプし、ON DELETE CASCADEすべての外部キー制約に句を追加してダンプを処理するスクリプトを作成し、そこから復元し、削除を実行し、再度ダンプし、を削除しON DELETE CASCADE、最後に再度復元することでした。これは、SQLでこれを行うために必要だった削除クエリを作成するよりも簡単でした。データベースのスライス全体を削除することは通常の操作ではないため、スキーマはそれに正確に適合していません。

次回このようなことが起こったときに、誰かがより良い解決策を持っていますか?

4

7 に答える 7

4

ダンプして復元する必要はありません。制約を削除し、カスケードで再構築し、削除を行い、再度削除し、restrict で再構築するだけでよいはずです。

CREATE TABLE "header"
(
  header_id serial NOT NULL,
  CONSTRAINT header_pkey PRIMARY KEY (header_id)
);

CREATE TABLE detail
(
  header_id integer,
  stuff text,
  CONSTRAINT detail_header_id_fkey FOREIGN KEY (header_id)
      REFERENCES "header" (header_id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
);
insert into header values(1);
insert into detail values(1,'stuff');
delete from header where header_id=1;
alter table detail drop constraint detail_header_id_fkey;
alter table detail add constraint detail_header_id_fkey FOREIGN KEY (header_id)
      REFERENCES "header" (header_id) on delete cascade;
delete from header where header_id=1;
alter table detail add constraint detail_header_id_fkey FOREIGN KEY (header_id)
      REFERENCES "header" (header_id) on delete restrict;
于 2008-09-30T22:34:48.973 に答える
1
TRUNCATE table CASCADE;

私は Postgres の初心者なので、TRUNCATE と DROP のトレードオフがどうなるかわかりません。

于 2010-06-09T21:44:35.920 に答える
1

外部キー制約を DEFERRABLE として作成できます。次に、データをスクラブしている間は一時的に無効にし、完了したら再度有効にすることができます。この質問を見てください。

于 2008-10-01T16:17:54.220 に答える
0

そのようなダンプファイルを処理する必要はないと思います。ストリーミング ダンプ/復元を実行し、それを処理します。何かのようなもの:

createdb -h scratchserver scratchdb
createdb -h scratchserver sanitizeddb

pg_dump -h liveserver livedb --schema-only | psql -h scratchserver sanitizeddb
pg_dump -h scratchserver sanitizeddb | sed -e "s/RESTRICT/CASCADE/" | psql -h scratchserver scratchdb

pg_dump -h liveserver livedb --data-only | psql -h scratchserver scratchdb
psql -h scrachserver scratchdb -f delete-sensitive.sql

pg_dump -h scratchserver scratchdb --data-only | psql -h scratchserver sanitizeddb
pg_dump -Fc -Z9 -h scratchserver sanitizedb > sanitizeddb.pgdump

すべての DELETE sql を delete-sensitive.sql に保存します。コンサルタントが RESTRICT 外部キーの代わりに CASCADE 外部キーを使用してデータベースを取得することを気にしない場合は、sanitizeddb データベース/ステップを削除できます。

これを行う必要がある頻度、データベースの大きさ、および機密データの割合によっては、より良い方法があるかもしれませんが、合理的なサイズで1回または2回行うより簡単な方法は思いつきませんデータベース。結局のところ、別のデータベースが必要になるため、既にslonyクラスターを持っていない限り、時間がかかる可能性のあるダンプ/復元サイクルを避けることはできません.

于 2008-09-11T15:59:23.703 に答える
0

PostgreSQL でスキーマを使用することを検討することをお勧めします。過去のプロジェクトでこれを行って、さまざまなグループの人々や開発者が独自のデータを持つことができるようにしました。次に、スクリプトを使用して、まさにそのような状況でデータベースの複数のコピーを作成できます。

于 2008-09-05T14:08:17.033 に答える
0

@Tony: いいえ、スキーマは便利です。実際、スキーマを使用してデータベース内のデータを分割しています。しかし、コンサルタントにデータベースのコピーを渡す前に、機密データをスクラブしようとしているのです。あのデータ消えてほしい

于 2008-09-06T16:29:59.587 に答える
0

TRUNCATE はテーブルからデータを削除し、構造をそのままにします

于 2010-07-23T17:55:41.997 に答える