2008-09-05 2 views
4

외래 키와 연결된 수십 개의 테이블이있는 데이터베이스가 있습니다. 정상적인 상황에서 이러한 제약 조건의 기본값은 ON DELETE RESTRICT입니다. 그러나 데이터베이스의 스냅 샷을 컨설턴트와 공유하려고 할 때 중요한 데이터를 제거해야했습니다. DELETE FROM Table CASCADE 명령에 대한 나의 기억이 순수 환각이 아니 었으면 좋겠다.PostgreSQL의 계단식 삭제

나는 그에서 복원도 모든 외래 키 제약 조건을 ON DELETE CASCADE 조항을 추가 내 삭제를 수행의 ON DELETE CASCADE을 제거, 다시 투기, 그리고 마지막으로 복원하여 덤프를 처리하는 스크립트를 작성, 데이터베이스를 덤프했다 하 고 밖으로 종료 무엇 다시. 그것은 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 sqls는 delete-sensitive.sql에 저장됩니다. 컨설턴트가 RESTRICT 외래 키 대신 CASCADE 외래 키를 사용하여 DB를 얻는 것을 신경 쓸 필요가 없다면 sanitizeddb 데이터베이스/단계를 제거 할 수 있습니다.

얼마나 자주 수행해야하는지, 데이터베이스의 크기 및 민감한 데이터의 비율에 따라 더 좋은 방법이있을 수도 있지만 더 간단한 방법으로 생각할 수는 없습니다 번 또는 두 번합리적으로 크기 데이터베이스입니다. 결국에는 다른 데이터베이스가 필요하기 때문에 이미 슬론 클러스터가 없으면 덤프/복원주기를 피할 수 없으므로 시간이 오래 걸릴 수 있습니다.

3

덤프 및 복원 할 필요가 없습니다. 제약 조건을 삭제하고, 계단식으로 다시 작성하고, 삭제하고, 다시 삭제하고, 제한으로 다시 작성할 수 있어야합니다.

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 vs. DROP에 대한 트레이드 오프가 확실하지 않습니다.

+0

잘라내기를 사용하면 표가 그대로 유지됩니다. 드롭은 테이블 자체를 제거합니다. – Hgehlhausen

0

TRUNCATE는 테이블에서 데이터를 제거하고 구조체를 벗어납니다.

관련 문제