sys.sp_cdc_enable_table(Transact-SQL)
적용 대상: SQL Server
현재 데이터베이스에서 지정된 원본 테이블에 대해 변경 데이터 캡처를 활성화합니다. 변경 데이터 캡처를 위해 테이블을 사용하도록 설정하면 테이블에 적용된 각 DML(데이터 조작 언어) 작업의 레코드가 트랜잭션 로그에 기록됩니다. 변경 데이터 캡처 프로세스는 로그에서 이 정보를 검색하고 함수 집합을 사용하여 액세스하는 테이블을 변경하기 위해 기록합니다.
변경 데이터 캡처는 SQL Server의 모든 버전에서 사용할 수 없습니다. SQL Server 버전에서 지원되는 기능 목록은 SQL Server 2022의 버전과 지원하는 기능을 참조하세요.
구문
sys.sp_cdc_enable_table
[ @source_schema = ] 'source_schema'
, [ @source_name = ] 'source_name'
[ , [ @capture_instance = ] 'capture_instance' ]
[ , [ @supports_net_changes = ] supports_net_changes ]
, [ @role_name = ] 'role_name'
[ , [ @index_name = ] 'index_name' ]
[ , [ @captured_column_list = ] N'captured_column_list' ]
[ , [ @filegroup_name = ] 'filegroup_name' ]
[ , [ @allow_partition_switch = ] 'allow_partition_switch' ]
[ ; ]
인수
[ @source_schema = ] 'source_schema'
원본 테이블이 속한 스키마의 이름입니다. @source_schema sysname이며, 기본값이 없으므로 사용할 수 없습니다NULL
.
[ @source_name = ] 'source_name'
변경 데이터 캡처를 사용하도록 설정할 원본 테이블의 이름입니다. @source_name sysname이며, 기본값이 없으므로 사용할 수 없습니다NULL
.
source_name 현재 데이터베이스에 있어야 합니다. 스키마의 테이블은 cdc
변경 데이터 캡처에 사용할 수 없습니다.
[ @role_name = ] 'role_name'
데이터를 변경하기 위해 액세스를 제어하는 데 사용되는 데이터베이스 역할의 이름입니다. @role_name sysname이며 지정해야 합니다. 명시적으로 설정된 NULL
경우 변경 데이터에 대한 액세스를 제한하는 데 게이팅 역할이 사용되지 않습니다.
역할이 현재 있는 경우 사용됩니다. 역할이 없으면 지정된 이름을 사용하여 데이터베이스 역할을 만들려고 시도합니다. 역할을 생성하기 전에 역할 이름 문자열의 오른쪽에 있는 공백은 잘립니다. 호출자가 데이터베이스 내에서 역할을 만들 권한이 없는 경우 저장 프로시저 작업이 실패합니다.
[ @capture_instance = ] 'capture_instance'
인스턴스별 변경 데이터 캡처 개체의 이름을 지정하는 데 사용되는 캡처 인스턴스의 이름입니다. @capture_instance sysname이며 될 수 없습니다NULL
.
지정하지 않으면 이름은 원본 스키마 이름과 원본 테이블 이름에서 <schemaname>_<sourcename>
형식으로 파생됩니다. @capture_instance 100자를 초과할 수 없으며 데이터베이스 내에서 고유해야 합니다. 지정되었든 파생되었 든 @capture_instance 문자열의 오른쪽에 있는 공백으로 잘립니다.
원본 테이블은 최대 두 개의 캡처 인스턴스를 가질 수 있습니다. 자세한 내용은 sys.sp_cdc_help_change_data_capture 참조하세요.
[ @supports_net_changes = ] supports_net_changes
이 캡처 인스턴스에 대해 순 변경 내용 쿼리를 지원하는지 여부를 나타냅니다. @supports_net_changes 기본 키가 테이블에 있거나 테이블에 @index_name 매개 변수를 사용하여 식별된 고유 인덱스가 있는 경우의 1
기본값이 비트입니다. 그렇지 않으면 매개 변수의 기본값은 .입니다 0
.
- 이 경우
0
모든 변경 내용을 쿼리하는 지원 함수만 생성됩니다. - 이 경우
1
순 변경 내용을 쿼리하는 데 필요한 함수도 생성됩니다.
@supports_net_changes 설정된 1
경우 @index_name 지정해야 하거나 원본 테이블에 정의된 기본 키가 있어야 합니다.
@supports_net_changes 설정1
되면 변경 테이블에 비클러스터형 인덱스가 추가로 생성되고 순 변경 쿼리 함수가 만들어집니다. 이 인덱스가 유지 관리되어야 하므로 순 변경을 사용하도록 설정하면 CDC 성능에 부정적인 영향을 미칠 수 있습니다.
[ @index_name = ] 'index_name'
원본 테이블의 행을 고유하게 식별하는 데 사용할 고유 인덱스의 이름입니다. @index_name sysname이며 될 수 있습니다NULL
. 지정된 경우 @index_name 원본 테이블에서 유효한 고유 인덱스여야 합니다. @index_name 지정하면 식별된 인덱스 열이 정의된 기본 키 열보다 테이블의 고유한 행 식별자로 우선합니다.
[ @captured_column_list = ] N'captured_column_list'
변경 테이블에 포함할 원본 테이블 열을 식별합니다. @captured_column_list nvarchar(max)이며 NULL
. 이 경우 NULL
모든 열이 변경 테이블에 포함됩니다.
열 이름은 원본 테이블의 유효한 열이어야 합니다. 기본 키 인덱스에 정의된 열 또는 @index_name 참조하는 인덱스에 정의된 열을 포함해야 합니다.
@captured_column_list 열 이름의 쉼표로 구분된 목록입니다. 목록 내의 개별 열 이름은 필요에 따라 큰따옴표() 또는 대괄호(""
[]
)를 사용하여 따옴표로 묶을 수 있습니다. 열 이름에 포함된 쉼표가 포함된 경우 열 이름을 따옴표로 묶어야 합니다.
@captured_column_list 예약된 열 이름을 __$update_mask
__$start_lsn
__$end_lsn
__$seqval
__$operation
포함할 수 없습니다.
[ @filegroup_name = ] 'filegroup_name'
캡처 인스턴스에 대해 만든 변경 테이블에 사용할 파일 그룹입니다. @filegroup_name sysname이며 될 수 있습니다NULL
. 지정한 경우 현재 데이터베이스에 대해 @filegroup_name 정의해야 합니다. 이 경우 NULL
기본 파일 그룹이 사용됩니다.
변경 데이터 캡처 변경 테이블을 위해 별도의 파일 그룹을 만드는 것이 좋습니다.
[ @allow_partition_switch = ] 'allow_partition_switch'
변경 데이터 캡처를 사용하도록 설정된 테이블에 대해 ALTER TABLE의 SWITCH PARTITION 명령을 실행할 수 있는지 여부를 나타냅니다. @allow_partition_switch 비트이며 기본값은 .입니다1
.
분할되지 않은 테이블의 경우 스위치 설정은 항상 1이며 실제 설정은 무시됩니다. 분할되지 않은 테이블에 대해 스위치가 명시적으로 설정된 0
경우 스위치 설정이 무시되었음을 나타내기 위해 경고 22857이 발생합니다. 분할된 테이블에 대해 스위치가 명시적으로 설정된 0
경우 원본 테이블의 파티션 스위치 작업이 허용되지 않음을 나타내기 위해 경고 22356이 발생합니다. 마지막으로 스위치 설정이 명시적으로 1
설정되거나 기본값 1
으로 설정되고 사용 가능한 테이블이 분할된 경우 파티션 스위치가 차단되지 않음을 나타내기 위해 경고 22855가 발생합니다. 파티션 스위치가 발생하는 경우 변경 데이터 캡처는 스위치로 인한 변경 내용을 추적하지 않습니다. 이렇게 하면 변경 데이터를 사용할 때 데이터가 일치하지 않습니다.
SWITCH PARTITION은 메타데이터 작업이지만 데이터를 변경합니다. 이 작업과 연결된 데이터 변경 내용은 변경 데이터 캡처 변경 테이블에서 캡처되지 않습니다. 세 개의 파티션이 있고 이 테이블이 변경된 테이블을 고려합니다. 캡처 프로세스는 테이블에 대해 실행되는 사용자 삽입, 업데이트 및 삭제 작업을 추적합니다. 그러나 파티션이 다른 테이블(예: 대량 삭제 수행)으로 전환되는 경우 이 작업의 일부로 이동된 행은 변경 테이블에서 삭제된 행으로 캡처되지 않습니다. 마찬가지로 미리 채워진 행이 있는 새 파티션이 테이블에 추가되는 경우 이러한 행은 변경 테이블에 반영되지 않습니다. 이로 인해 애플리케이션에서 변경 내용을 사용하고 대상에 적용할 때 데이터 불일치가 발생할 수 있습니다.
SQL Server에서 파티션 전환을 사용하도록 설정하는 경우 가까운 장래에 분할 및 병합 작업이 필요할 수도 있습니다. 복제 또는 CDC 사용 테이블에서 분할 또는 병합 작업을 실행하기 전에 해당 파티션에 보류 중인 복제 명령이 없는지 확인합니다. 또한 분할 및 병합 작업 중에는 파티션에서 DML 작업이 실행되고 있지 않아야 합니다. 로그 판독기 또는 CDC 캡처 작업이 처리되지 않은 트랜잭션이 있거나 분할 또는 병합 작업이 실행되는 동안 복제 또는 CDC 사용 테이블의 파티션에서 DML 작업이 수행되는 경우(동일한 파티션 포함) 로그 판독기 에이전트 또는 CDC 캡처 작업과 함께 처리 오류(오류 608 - 파티션 ID에 대한 카탈로그 항목을 찾을 수 없음)가 발생할 수 있습니다. 오류를 수정하려면 구독을 다시 초기화하거나 해당 테이블 또는 데이터베이스에서 CDC를 사용하지 않도록 설정해야 할 수도 있습니다.
반환 코드 값
0
(성공) 또는 1
(실패).
결과 집합
없음.
설명
변경 데이터 캡처를 위해 테이블을 사용하도록 설정하려면 먼저 데이터베이스를 사용하도록 설정해야 합니다. 데이터베이스가 변경 데이터 캡처를 사용할 수 있는지 여부를 확인하려면 sys.databases 카탈로그 뷰의 열을 쿼리 is_cdc_enabled
합니다. 데이터베이스를 사용하도록 설정하려면 sys.sp_cdc_enable_db 저장 프로시저를 사용합니다.
테이블에 대해 변경 데이터 캡처를 사용하도록 설정하면 변경 테이블과 하나 또는 두 개의 쿼리 함수가 생성됩니다. 변경 테이블은 캡처 프로세스에 의해 트랜잭션 로그에서 추출된 원본 테이블 변경 내용에 대한 리포지토리 역할을 합니다. 쿼리 함수는 변경 테이블에서 데이터를 추출하는 데 사용됩니다. 이러한 함수의 이름은 다음과 같은 방법으로 @capture_instance 매개 변수에서 파생됩니다.
- 모든 변경 내용 함수:
cdc.fn_cdc_get_all_changes_<capture_instance>
- 순 변경 함수:
cdc.fn_cdc_get_net_changes_<capture_instance>
sys.sp_cdc_enable_table
또한 원본 테이블이 변경 데이터 캡처를 사용하도록 설정된 데이터베이스의 첫 번째 테이블이고 데이터베이스에 대한 트랜잭션 게시가 없는 경우 데이터베이스에 대한 캡처 및 정리 작업을 만듭니다. sys.tables 카탈로그 뷰1
의 열을 .로 설정합니다is_tracked_by_cdc
.
SQL Server 에이전트 테이블에 대해 CDC를 사용하도록 설정한 경우 실행할 필요가 없습니다. 그러나 캡처 프로세스는 트랜잭션 로그를 처리하고 SQL Server 에이전트 실행되지 않는 한 변경 테이블에 항목을 기록하지 않습니다.
사용 권한
db_owner 고정 데이터베이스 역할의 멤버 자격이 필요합니다.
예제
A. 필요한 매개 변수만 지정하여 변경 데이터 캡처 사용
다음 예제에서는 테이블에 대한 변경 데이터 캡처를 HumanResources.Employee
사용하도록 설정합니다. 필수 매개 변수만 지정됩니다.
USE AdventureWorks2022;
GO
EXECUTE sys.sp_cdc_enable_table
@source_schema = N'HumanResources',
@source_name = N'Employee',
@role_name = N'cdc_Admin';
GO
B. 추가 선택적 매개 변수를 지정하여 변경 데이터 캡처 사용
다음 예제에서는 테이블에 대한 변경 데이터 캡처를 HumanResources.Department
사용하도록 설정합니다. @allow_partition_switch 제외한 모든 매개 변수가 지정됩니다.
USE AdventureWorks2022;
GO
EXEC sys.sp_cdc_enable_table
@source_schema = N'HumanResources',
@source_name = N'Department',
@role_name = N'cdc_admin',
@capture_instance = N'HR_Department',
@supports_net_changes = 1,
@index_name = N'AK_Department_Name',
@captured_column_list = N'DepartmentID, Name, GroupName',
@filegroup_name = N'PRIMARY';
GO