대량 가져오기 작업으로 제약 조건 검사 제어
데이터를 대량으로 가져올 때 대량 가져오기 작업에 의해 CHECK 제약 조건이 강제 적용되는지 여부를 제어할 수 있습니다. 제약 조건은 유효한 값을 정의하도록 열에 적용되는 비즈니스 규칙입니다. 예를 들어 전화 교환 번호가 있는 열에 대한 제약 조건에는 #### 형식이 필요할 수 있습니다. 제약 조건을 정의 및 검사하는 것은 데이터 무결성을 강제 적용하는 표준 메커니즘입니다. Microsoft에서는 일반적으로 증분 대량 가져오기 중 제약 조건 검사를 사용하는 것을 권장합니다.
제약 조건을 무시하려는 경우도 있을 수 있습니다. 예로 든 시나리오의 경우 제약 조건을 위반하는 행이 입력 데이터에 포함되는 경우입니다. 제약 조건을 무시하여 데이터를 로드한 다음 Transact-SQL 문을 사용하여 데이터를 정리할 수 있습니다.
[!참고]
대량 가져오기 작업 중 제약 조건을 무시하면 기존의 제약 조건을 위반하는 데이터가 테이블에 삽입될 수 있습니다. 그러므로 테이블의 제약 조건은 sys.check_constraints 카탈로그 뷰에 is_not_trusted로 표시됩니다(sys.check_constraints(Transact-SQL) 참조). 어느 시점에서는 전체 테이블의 제약 조건을 확인할 필요가 있습니다.
대량 가져오기 작업을 수행하기 전에 테이블이 비어 있지 않은 경우 제약 조건의 유효성을 다시 검사하는 비용이 증분 데이터에 CHECK 제약 조건을 적용하는 비용을 초과할 수 있습니다. 문제가 있는 데이터를 가져온 후 Transact-SQL을 사용하여 가져온 데이터를 정리해야 합니다.
중요 |
---|
제약 조건이 비활성화되어 있을 때 스키마 수정 잠금이 사용되어 메타데이터를 업데이트할 수 있습니다. 이 경우 다른 명령(예: 온라인 인덱스 작성) 또는 트랜잭션을 방해할 수 있습니다. 예를 들어 동시 DDL 변경으로 인해 대상 테이블에 액세스하는 스냅숏 격리 트랜잭션이 실패할 수 있습니다. |
제약 조건에 대한 자세한 내용은 제약 조건을 참조하십시오.
대량 가져오기 작업 중 제약 조건 검사 동작은 해당 작업에 사용된 명령에 따라 달라집니다. 기본적으로 bcp 명령 및 BULK INSERT 문은 제약 조건을 무시합니다. 반대로 INSERT ... SELECT * FROM OPENROWSET(BULK...) 문의 경우에는 기본값이 제약 조건을 검사하는 것입니다.
다음 표에서는 대량 가져오기 명령의 기본 제약 조건 검사 동작을 요약하여 보여 줍니다.
명령 |
기본 동작 |
---|---|
bcp |
제약 조건 무시 |
BULK INSERT |
제약 조건 무시 |
INSERT ... SELECT * FROM OPENROWSET(BULK...) |
Check 제약 조건 |
각 대량 가져오기 명령은 다음 섹션에 설명된 바와 같이 제약 조건이 처리되는 방법을 변경할 수 있는 한정자를 제공합니다.
bcp 또는 BULK INSERT로 제약 조건 검사
기본적으로 제약 조건은 bcp 명령 또는 BULK INSERT 문에서 수행되는 대량 가져오기 작업 중 무시됩니다.
bcp 명령 및 BULK INSERT 문을 사용하면 대량 가져오기 작업 중 제약 조건이 강제 설정되도록 지정할 수 있습니다. 제약 조건의 강제 설정은 대량 가져오기 작업의 진행을 느리게 하지만 삽입된 모든 데이터가 기존의 제약 조건을 위반하지 않도록 합니다. 다음 표에서는 대량 가져오기 작업 중 제약 조건의 강제 설정을 지정하는 데 사용할 수 있는 한정자를 요약하여 보여 줍니다.
명령 |
한정자 |
한정자 유형 |
---|---|---|
bcp |
-h"CHECK_CONSTRAINTS" |
힌트 |
BULK INSERT |
CHECK_CONSTRAINTS |
인수 |
자세한 내용은 bcp 유틸리티 및 BULK INSERT(Transact-SQL)를 참조하십시오.
INSERT ... SELECT * FROM OPENROWSET(BULK...)의 제약 조건 무시
기본적으로 INSERT는 CHECK 제약 조건을 검사하지만 INSERT ... SELECT * FROM OPENROWSET(BULK...) 문을 사용하면 CHECK 제약 조건의 검사 내용을 덮어쓸 수 있습니다. 제약 조건에 대한 자세한 내용은 CHECK 제약 조건을 참조하십시오.
[!참고]
CHECK 제약 조건만 비활성화될 수 있습니다. UNIQUE, PRIMARY KEY, FOREIGN KEY 또는 NOT NULL 제약 조건은 비활성화할 수 없습니다.
다음 테이블은 CHECK 제약 조건을 무시하는 테이블 힌트를 요약합니다.
명령 |
한정자 |
한정자 유형 |
---|---|---|
INSERT ... SELECT * FROM OPENROWSET(BULK...) |
WITH (IGNORE_CONSTRAINTS) |
테이블 힌트 |
다음은 이 한정자를 사용하는 방법을 보여 주는 예입니다. IGNORE_CONSTRAINTS 힌트에 대한 자세한 내용은 테이블 힌트(Transact-SQL)를 참조하십시오.
데이터를 가져왔는지 확인
대량 가져오기 작업에서 제약 조건을 무시하면 가져온 데이터를 수동으로 검사하는 방법으로 제약 조건을 위반하는 가져온 테이블 행을 나중에 식별할 수 있습니다. 데이터를 수동으로 검사하기 위해 제약 조건을 테스트하는 Transact-SQL 쿼리 또는 저장 프로시저를 확인할 수 있습니다.
[!참고]
테이블이 트러스트되는지 여부를 확인하려면 sys.check_constraints 카탈로그 뷰의 is_not_trusted 열을 참조하십시오. 자세한 내용은 sys.check_constraints(Transact-SQL)를 참조하십시오.