2008-09-05 21 views
4

私は外部キーと相互にリンクされた数十のテーブルを持つデータベースを持っています。通常の状況下では、これらの制約に対してデフォルトのON DELETE RESTRICTの動作が必要です。しかし、データベースのスナップショットをコンサルタントと共有しようとする際に、機密データを削除する必要がありました。私はDELETE FROM Table CASCADEコマンドの記憶が純粋な幻覚ではなかったことを願っています。 、あまりにもすべての外部キー制約をON DELETE CASCADE条項を追加することから復元、私の削除を実行し、再び投棄、ON DELETE CASCADEを除去し、最終的に復元することにより、ダンプを処理するスクリプトを書いて、データベースをダンプして私は何をやって終了PostgreSQLのカスケード削除

再び。これは、SQLでこれを行うために必要だった削除クエリを書くよりも簡単でした。データベースのスライス全体を削除するのは通常の操作ではないため、スキーマはそれにはあまり適していません。

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

答えて

0

PostgreSQLでschemasを使用してみるとよいでしょう。過去のプロジェクトでこれをやって、人々や開発者の異なるグループが自分のデータを持つことを可能にしました。次に、スクリプトを使用して、そのような状況のためにデータベースの複数のコピーを作成することができます。

0

@トニー:いいえ、スキーマは便利であり、実際にはデータベースのデータを分割するために使用します。しかし、私は、コンサルタントにdbのコピーを持たせる前に機密データをスクラブしようとしています。私はそのデータを消したい。

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-sensitive.sqlにすべてのDELETE sqlsを格納します。コンサルタントがRESTRICT外部キーの代わりにCASCADE外部キーを使用してDBを取得しても構わない場合は、sanitizeddbデータベース/ステップを削除できます。

これを実行する頻度、データベースの大きさ、および機密性の高いデータの割合に応じて、より良い方法があるかもしれませんが、それを行うための簡単な方法は考えられません。2回合理的なサイズデータベース。結局のところ、別のデータベースが必要になります。スレーンクラスターがない場合は、ダンプ/リストアのサイクルを避けることができません。これは時間がかかることがあります。

3

ダンプして復元する必要はありません。制約を削除し、カスケードで再構築し、削除し、再度削除し、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; 
1

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

1
TRUNCATE table CASCADE; 

私はPostgresの初心者ですから、TRUNCATEとDROPのトレードオフについてはわかりません。

+0

トランケートはテーブルを残します。ドロップするとテーブル自体が削除されます。 – Hgehlhausen

0

TRUNCATEはテーブルからデータを削除して構造体を残します。

関連する問題