변경 테이블 점검 제한 조건


25

외래 키 제약 조건을 선택하고 스크립팅 할 때 SQL Server의 개체 탐색기에서 다음 코드가 생성됩니다.

     USE [MyTestDatabase]
     GO

     ALTER TABLE [dbo].[T2] WITH NOCHECK ADD CONSTRAINT [FK_T2_T1] FOREIGN KEY([T1ID])
     REFERENCES [dbo].[T1] ([T1ID])
     GO

     ALTER TABLE [dbo].[T2] CHECK CONSTRAINT [FK_T2_T1]
     GO

마지막 진술 "ALTER TABLE CHECK CONSTRAINT"의 목적은 무엇입니까? 실행 여부는 중요하지 않습니다. 기존의 불량 데이터에 대해서는 실패하지 않으며 새로운 데이터에 대해 제한 조건이 적용되도록 변경하지도 않습니다.

감사!

답변:


23

구속 조건이 작성된 후에 사용 가능한지 확인합니다. 귀하의 ALTER TABLE진술에는 WITH NOCHECK제약 조건을 만드는 동안 기존의 불량 데이터를 확인하지 말라고 말하는 것이 포함되어 있습니다.

작성된 바와 같이, 기존 데이터는 WITH NOCHECK첫 번째 명령문으로 인해 제한 조건에 대해 점검되지 않습니다 . 두 번째 명령문을 발행하면 제한 조건이 적용되는 테이블의 향후 변경 사항에 대해 제한 조건을 점검 할 수 ALTER TABLE [dbo].[T2] NOCHECK CONSTRAINT [FK_T2_T1]있습니다.

작성된이 명령문은 기본적으로 "이 외래 키 제한 조건을 작성하지만 기존 데이터와 비교하여 점검하지 않습니다. 향후 데이터 변경 사항에 대해이를 활성화하십시오"라고 말합니다.


실제로 나는 데이터가 잘못되어도 차이가 없지만 첫 번째 또는 두 번째 줄은 실패하지 않는다는 것을 확인했습니다. 한 번의 실패로 만들려면 다음과 같이 보일 것입니다.
Delux

2
점검 점검 제한 조건이있는 테이블 [dbo]. [T2] 변경 [FK_T2_T1]
Delux

권리. 그러나 어느 시점에서 제약 조건을 위반하는 INSERT 또는 UPDATE를 실행하려고하면 실패한 것을 알 수 있습니다. 이 두 명령문이 실행될 때 잘못된 데이터가 존재해도 실패하지 않습니다.
squillman

7

첫 번째 문장은 비활성화 된 제약 조건을 만듭니다. 사용 가능하고 신뢰할 수 있어야합니다. 다음과 같은 이상한 구문을 통해 제약 조건을 활성화하고 신뢰할 수 있습니다.

ALTER TABLE YourTable
      WITH CHECK CHECK CONSTRAINT YourConstraint;

Hugo Kornelis의 훌륭한 블로그 게시물이 자세히 설명되어 있습니다. 제약 조건을 신뢰할 수 있습니까?

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.