2010-01-29 4 views
1

외래 키가 없으므로 참조 무결성이 부족한 ERP 데이터베이스가 있습니다.SQL Server 2000에서 고아 레코드 찾기

데이터베이스의 주요 테이블의 대부분이 고아 레코드임을 확인하는 스크립트를 작성하고 있습니다.

예를 들어,이 경우 영업 테이블을 사용하고 있습니다.

SLCDPM - Customer Master Table 
SOMAST - Sales Order Master 
SOITEM - Sales Order Items 
SORELS - Sales Order Releases 

기본적으로, 내가 위의 모든 테이블에 표시되지 않는 SORELS에 기록이 있는지 확인해야이 (그리고 다른 테이블의 전체 무리)합니다. 그런 다음 SOITEM을 가져 와서 위에 체크하십시오. 기타

필자는 스크립트를 작성하기 시작했으나 줄의 수는 다소 어리 석다. 다음은이 4 개의 테이블로 시작한 부분입니다. 나는 중지

select 'Sales Order Master',* from somast where fcustno not in (select fcustno from slcdpm where ftype <> 'P') 
SELECT 'Sales Order Item',* FROM soitem WHERE fsono NOT IN (SELECT fsono FROM somast) 
select 'Sales Order Release',* from sorels where (fsono+finumber) not in (select (fsono+finumber) from SOITEM) 

이유는 그냥 SORELS (아래 표)뿐만 아니라 모든 테이블 그 전에, 그 전에 테이블을 검사 것을 깨달았다이었다.

누구나이 스크립트를 사용하여 더 자동화 된 방식으로 만들 수 있습니다.

답변

2

사람들은 이와 같이 데이터베이스 정크를 판매합니다. 항상 상업용 제품에서 볼 수있는 것을 놀라게합니다.

이것은 동적 SQL과 커서를위한 진짜 케이스라고 생각합니다. 이것은 정확히 일회성 관리 기능의 일종으로 이러한 기술이 존재하는 이유입니다 (프로덕션 코드는 주로 관리 작업용이 아닙니다).

나는 각각의 테이블과 테이블을 보여주는 테이블을 만들 것이다. foriegn 키가 있어야한다고 생각한다. (적어도 네이밍 규칙이 좋은 경우 시스템 테이블에서이 값을 채울 수도 있습니다.)

그런 다음 커서를 사용하여 테이블을 탐색하고 sql을 dymanically 생성하여 FK 테이블에 고아 레코드가 있는지 확인합니다.

아직 많은 코드가 있지만 적어도 작성하지 않아도됩니다.

관련 문제