2010-06-04 3 views
1

많은 데이터를 SQL Server 데이터베이스로 가져와야합니다. 이 데이터 중 일부는 오래전부터 가져 왔으며 상당 부분이 참조 무결성을 유지하지는 않지만 새로운 데이터를 모두 가져오고 싶습니다. 가져 오기 전에 제약 조건 검사를 해제 할 수 있지만 나중에 추가 될 데이터에 대해서만 다시 설정하는 방법은 무엇입니까? 이것이 가능합니까 아니면 과거 데이터를 수정해야합니까? 오래된 잘못된 데이터에 대한 하나, 새로운 하나 -SQL Server 제약 조건 검사를 새 데이터로만 제한합니다.

감사합니다, 못생긴 대안으로

답변

4

NOCHECK

로 FKS을 다시 추가 데이터를 추가, 당신의 FK 제약 조건을 드롭 당신은 앞으로 그 시간에서 데이터를 확인하는 제약 조건을 추가 할 수 있지만,
+0

나쁜 생각 수입은 단일 사용자 모드로 실행하지 않는

예. 당신은 당신의 프로세스뿐만 아니라 모든 사람들을위한 제약 조건을 포기합니다. 이런 식으로 더 나쁜 데이터로 끝날 수도 있습니다. – HLGEM

+0

완전히 동의합니다. 관계는 이유가 있으며 항상 (거의 항상) 유지되어야합니다. 그러나 불가능한 경우와 관계를 되돌리려 고 노력할만한 가치가없는 드문 경우가 있습니다. 기존 시스템의 변환이 마음에 듭니다. -EDIT, 나는이 말을 내 게시물에 붙여 넣으려는 것이지 내 의견이 아닙니다. –

+0

레거시에서의 변환은 정확히 무엇입니까. 그러나 오래된 데이터를 고칠 수있는 데이터가 부족할 수 있습니다. 그렇지 않은 경우이 작업이 수행됩니다. 감사. – Jeff

2

, 난 당신이 두 개의 테이블을 가질 수 있다고 가정합니다. DRI 제약 조건을 새 테이블에만 놓습니다. 그런 다음 UNION과 함께 VIEW에 래핑하면 다른 코드가 단일 단위로 함께 쿼리 할 수 ​​있습니다.

1

당신은 같이 (해당 행을 업데이트하려고하면 가져 오기 또는 심지어 사용자 인터페이스를 통해), 데이터를 수정하지 않으면 제약 조건에 도달하여 실패합니다. 제약 조건을 추가하기 전에 데이터를 수정하는 것이 좋습니다. 어쨌든 나쁜 데이터이므로 수정해야합니다. 자식 ID가 있지만 부모가없는 레코드가있는 경우 부모 테이블에 UNKNOWN에 대한 기본 레코드를 추가해야 할 수도 있습니다. 그런 다음 UNKNOWN 레코드 ID로 조회를 변경하십시오.

2

사용 NOCHECK

CREATE TABLE CheckTbl (col1 int, col2 int); 
GO 


insert CheckTbl values(1,1) 
insert CheckTbl values(2,1) 

ALTER TABLE CheckTbl WITH NOCHECK 
ADD CONSTRAINT chkRowCount CHECK (col1 > 1) ; 
GO 

-- will fail now 
insert CheckTbl values(1,1)