필드를 변경하지 않고 필드를 변경하고 null이 아닌 값으로 만들 수 있습니다. 정말로 시간이 없다면 필드에 제약 조건을 추가하여 필드가 null이 아닌지 확인하십시오. 이렇게하면 check with no 옵션을 사용하고 4 백만 행의 각각을 확인하여 업데이트 여부를 확인할 수 없습니다.
- 업데이트되는 새로운 행을 방지하고 변경되지 않은 원래의 사람을 떠나 제약 조건을 사용하여
CREATE TABLE Test
(
T0 INT Not NULL,
T1 INT NUll
)
INSERT INTO Test VALUES(1, NULL) -- Works!
ALTER TABLE Test
WITH NOCHECK
ADD CONSTRAINT N_null_test CHECK (T1 IS NOT NULL)
ALTER COLUMN T1 int NOT NULL
INSERT INTO Test VALUES(1, NULL) -- Doesn't work now!
정말 두 가지 옵션 (추가 편집을 참조하십시오 세 번째)가 있습니다.
- null 인 행을 다른 것으로 업데이트 한 후 not null alter 옵션을 적용하십시오. 프로세스가 테이블에서 잠기는 것을 신경 쓰지 않는 한,이 작업은 근무 시간 외에서 실행해야합니다.
특정 시나리오에 따라 두 옵션 중 어느 것이 더 좋을지도 모릅니다. 비록 당신이 떨어져 시간에 그것을 실행해야하기 때문에 옵션을 선택하지 않을 것이다. 장기적으로 당신이 한밤중에 업데이트하는 데 소비하는 시간은 두시간을 절약하기 위해 지름길로 얼굴을 마주보고 있을지 모르는 두통과 비교하면 잘 될 것입니다.
이 모든 것이 언급되었으므로 옵션 2로 가면 근무 시간 외의 작업량을 최소화 할 수 있습니다. 당신이 열을 변경하기 전에에 null가 아닌 행을 업데이트 확인해야하기 때문에, 당신은 천천히 (상대 한 번에 모든 일에)
- 보고 각 행
- 확인을 통해 이동 커서를 쓸 수 있습니다 그것이 null 인 경우
- 적절히 업데이트하십시오. 이 작업은 시간이 걸리지 만 다른 프로그램이 테이블 블록 전체에 액세스하는 것을 잠그지는 않습니다. 합니다 (with(rowlock) 테이블 힌트를 잊지 마세요!)
편집 : 당신은 적절한 열이있는 새 테이블을 만든 다음 원래 테이블에서 데이터를 내보낼 수 있습니다 : 난 그냥 세 번째 옵션의 생각 새로운 것에. 이 작업이 완료되면 원래 테이블을 삭제하고 새 테이블의 이름을 이전 테이블로 변경할 수 있습니다. 이렇게하려면 원본에 대한 종속성을 해제하고 작업이 끝나면 새 프로젝트에 대한 종속성을 설정해야하지만,이 프로세스를 사용하면 업무 외 시간에 수행해야하는 작업량이 크게 줄어 듭니다. 이는 관리 스튜디오를 통해 테이블에 열 순서 변경을 수행 할 때 SQL Server가 사용하는 것과 동일한 접근 방식입니다. 이 접근법에 대해, 나는 청크로 삽입을 수행하여 시스템에 실행 취소 스트레스가 발생하지 않도록하고 다른 사용자가 시스템에 액세스하는 것을 막지 않도록하십시오. 그런 다음 근무 시간 외의 시간에 원본을 삭제하고 두 번째 이름을 변경하고 종속성 등을 적용 할 수 있습니다. 아직 근무 시간이 다소 남아 있지만 다른 접근 방식과 비교하면 아주 적습니다.
sp_rename으로 링크하십시오.
개인적으로 오프 피크 시간을 제외한 모든 시간에 기존의 대형 테이블에서 테이블 구조를 변경하지 않을 것입니다.비록 그것이 매우 빠르다 고해도, 사용자가 변화를 일으켜 문제를 일으키는 순간에 일을하는 과정에서 사용자를 유발할 수 있습니다. 큰 변경 사항은 단일 사용자 모드에서도 가장 잘 수행됩니다. 사용자가 아무 것도 할 수없는 예약 된 유지 보수 기간 (예 : 물론 피크 시간대가 아닌 시간에 발표 됨)을 사용하면 오류가 발생하는 무언가를하는 도중에 불행한 사용자를 갖는 것보다 훨씬 더 좋습니다. – HLGEM
변경할 열이 FK 제약 조건에 포함되어 있습니까? – onupdatecascade
프로파일 러의 빠른 테스트에서 테이블에 대한 Sch-M 잠금 (기본적으로 모든 것과 호환되지 않음) (http://msdn.microsoft.com/en-us/library/ms186396.aspx). 그런 다음 모든 페이지를 읽고 모든 행이 유효한지 확인해야합니다. –