문제

나는 그들 사이에 정교한 관계를 가진 많은 테이블을 포함하는 매우 큰 데이터베이스 (PostgreSQL에서 실행)를 가지고 있습니다 (외국 키, 삭제 캐스케이드 등). 여러 테이블에서 일부 데이터를 제거해야하지만 캐스케이드 제거로 인해 데이터베이스에서 실제로 어떤 양의 데이터가 삭제 될지 잘 모르겠습니다.

삭제되지 않아야 할 데이터를 삭제하지 않으면 어떻게 확인할 수 있습니까?

나는 테스트 데이터베이스를 가지고 있습니다 - 내가 원하는 것을 할 수있는 실제 사본 만 있습니다 :)

내가 가진 유일한 아이디어는 전후에 덤프 데이터베이스를 확인하고 확인하는 것입니다. 그러나 그것은 편안하지 않습니다. 또 다른 아이디어 - 데이터베이스의 일부를 덤프하면 내 생각에 따라 내 삭제 명령문의 영향을 받아야하고 데이터 제거 전후 에이 부분을 확인해야합니다. 그러나 나는 그것을 할 수있는 간단한 방법을 보지 못합니다 (수백 개의 테이블이 있고 제거는 ~ 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를 다시 돌아 오는 것이 아무리 확신하더라도!

답변 주셔서 감사합니다!

Vinko, 당신의 대답은 저에게 매우 유용하며 Dipper를 공부할 것입니다.

실제로, 내 경우, 레코드 삭제 전후에 테이블 수를 비교하고 그 영향을받은 테이블을 확인하는 것으로 충분했습니다.

아래에 설명 된 간단한 명령으로 수행되었습니다

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