<cdc.fn_cdc_get_net_changes_capture_instance>(Transact-SQL)

적용 대상:SQL Server

지정된 LSN(로그 시퀀스 번호) 범위 내에서 변경된 각 원본 행에 대해 하나의 순 변경 행을 반환합니다.

잠깐만요, LSN이란? SQL Server 트랜잭션 로그모든 레코드는 LSN(로그 시퀀스 번호)으로 고유하게 식별됩니다. LSN2가 LSN1보다 크면 LSN2에서 참조하는 로그 레코드에서 설명하는 변경 내용이 로그 레코드 LSN에서 설명한 변경 후에 발생하도록 LSN이 정렬됩니다.

중요한 이벤트가 발생한 로그 레코드의 LSN은 올바른 복원 시퀀스를 생성하는 데 유용할 수 있습니다. LSN은 정렬되므로 같음과 같지 않음(즉, <, , >=, =, <=, >=)에 대해 비교할 수 있습니다. 이러한 비교는 복원 시퀀스를 생성할 때 유용합니다.

LSN 범위 동안 원본 행에 여러 변경 내용이 있는 경우 행의 최종 내용을 반영하는 단일 행이 아래에 설명된 열거형 함수에 의해 반환됩니다. 예를 들어 트랜잭션이 원본 테이블에 행을 삽입하고 LSN 범위 내의 후속 트랜잭션이 해당 행에 있는 하나 이상의 열을 업데이트하는 경우 함수는 업데이트된 열 값을 포함하는 하나의 행만 반환합니다.

이 열거 함수는 원본 테이블에 변경 데이터 캡처를 사용하도록 설정되어 있고 순 변경 추적이 지정된 경우에 생성됩니다. 순 추적을 사용하도록 설정하려면 원본 테이블에 기본 키 또는 고유 인덱스가 있어야 합니다. 함수 이름은 파생되고 형식 cdc.fn_cdc_get_net_changes_<capture_instance>을 사용합니다. 여기서 <capture_instance> 원본 테이블이 변경 데이터 캡처를 사용하도록 설정되었을 때 캡처 인스턴스에 대해 지정된 값입니다. 자세한 내용은 sys.sp_cdc_enable_table(Transact-SQL)을 참조하세요.

Transact-SQL 구문 표기 규칙

구문

  
cdc.fn_cdc_get_net_changes_capture_instance ( from_lsn , to_lsn , '<row_filter_option>' )  
  
<row_filter_option> ::=  
{ all  
 | all with mask  
 | all with merge  
}  

인수

from_lsn

결과 집합에 포함할 LSN 범위의 하위 엔드포인트를 나타내는 LSN입니다. from_lsn binary(10)입니다.

cdc의 행만.[ capture_instance]_CT 값이 __$start_lsn from_lsn 보다 크거나 같은 변경 테이블이 결과 집합에 포함됩니다.

to_lsn

결과 집합에 포함할 LSN 범위의 상위 엔드포인트를 나타내는 LSN입니다. to_lsn binary(10)입니다.

cdc의 행만.[ capture_instance]_CT 값이 __$start_lsn from_lsn 또는 to_lsn음인 변경 테이블이 결과 집합에 포함됩니다.

<> row_filter_option ::= { all | 모두 마스크 | 모두 병합 }

메타데이터 열의 내용과 결과 집합에서 반환된 행을 제어하는 옵션입니다. 다음 옵션 중 하나일 수 있습니다.

all
행에 대한 최종 변경 내용의 LSN과 메타데이터 열 __$start_lsn 및 __$operation에 행을 적용하는 데 필요한 작업을 반환합니다. __$update_mask 열은 항상 NULL입니다.

모두 마스크가 있는 경우
행에 대한 최종 변경 내용의 LSN과 메타데이터 열 __$start_lsn 및 __$operation에 행을 적용하는 데 필요한 작업을 반환합니다. 또한 업데이트 작업이 반환될 때(__$operation = 4) 업데이트에서 수정된 캡처된 열이 __$update_mask 반환된 값으로 표시됩니다.

모두 병합
메타데이터 열 __$start_lsn 행에 대한 최종 변경 내용의 LSN을 반환합니다. __$operation 열은 두 값 중 하나입니다. 삭제의 경우 1과 변경 사항을 적용하는 데 필요한 작업이 삽입 또는 업데이트임을 나타내는 5입니다. __$update_mask 열은 항상 NULL입니다.

지정된 변경에 대한 정확한 작업을 결정하는 논리가 쿼리 복잡성을 더하기 때문에 이 옵션은 변경 데이터를 적용하는 데 필요한 작업이 삽입 또는 업데이트임을 나타내기에 충분할 때 쿼리 성능을 향상하도록 설계되었지만 둘을 명시적으로 구분할 필요는 없습니다. 이 옵션은 병합 작업을 직접 사용할 수 있는 대상 환경에서 가장 유용합니다.

반환된 테이블

열 이름 데이터 형식 설명
__$start_lsn binary(10) 변경에 대한 커밋 트랜잭션과 연결된 LSN입니다.

동일한 트랜잭션에서 커밋된 모든 변경 내용은 동일한 커밋 LSN을 공유합니다. 예를 들어 원본 테이블의 업데이트 작업이 두 행의 두 열을 수정하는 경우 변경 테이블에는 각각 동일한 __$start_lsnvalue 있는 4개의 행이 포함됩니다.
__$operation int 변경 데이터의 행을 대상 데이터 원본에 적용하는 데 필요한 DML(데이터 조작 언어) 작업을 식별합니다.

row_filter_option 매개 변수의 값이 모두 또는 모두 마스크인 경우 이 열의 값은 다음 값 중 하나일 수 있습니다.

1 = 삭제

2 = 삽입

4 = 업데이트

row_filter_option 매개 변수의 값이 모두 병합된 경우 이 열의 값은 다음 값 중 하나일 수 있습니다.

1 = 삭제

5 = 삽입 또는 업데이트
__$update_mask varbinary(128) 캡처 인스턴스에 대해 식별된 각 캡처된 열에 해당하는 비트가 있는 비트 마스크입니다. 이 값은 __$operation = 1 또는 2일 때 정의된 모든 비트가 1로 설정됩니다. __$operation = 3 또는 4이면 변경된 열에 해당하는 비트만 1로 설정됩니다.
<captured source table columns> {b>상황에 따라 다름 함수에서 반환되는 나머지 열은 캡처 인스턴스 생성 시 캡처된 열로 식별된 원본 테이블의 열입니다. 캡처된 열 목록에 열이 지정되지 않은 경우 원본 테이블의 모든 열이 반환됩니다.

사용 권한

sysadmin 고정 서버 역할 또는 db_owner 고정 데이터베이스 역할의 멤버 자격이 필요합니다. 다른 모든 사용자의 경우 원본 테이블의 모든 캡처된 열에 대해 SELECT 권한이 필요하며 캡처 인스턴스에 대한 게이팅 역할이 정의된 경우 해당 데이터베이스 역할의 멤버 자격이 필요합니다. 호출자에게 원본 데이터를 볼 수 있는 권한이 없으면 함수는 모든 열에 대해 NULL 값이 있는 행을 반환합니다.

설명

행의 고유 식별자를 수정하면 fn_cdc_get_net_changes DELETE 및 INSERT 명령이 있는 초기 UPDATE 명령이 대신 표시됩니다. 이 동작은 변경 전후에 키를 추적하는 데 필요합니다.

제공된 LSN 범위가 호출 cdc.fn_cdc_get_all_changes_<capture_instance> 하거나 cdc.fn_cdc_get_net_changes_<capture_instance>호출할 때 적절하지 않은 경우 오류 313이 필요합니다. 매개 변수가 lsn_value 가장 낮은 LSN 또는 가장 높은 LSN의 시간을 초과하면 이러한 함수를 실행하면 오류 313 Msg 313, Level 16, State 3, Line 1 An insufficient number of arguments were supplied for the procedure or function이 반환됩니다. 이 오류는 개발자가 처리해야 합니다. 해결 방법을 위한 샘플 T-SQL은 GitHub의 ReplTalk에서 찾을 수 있습니다.

다음 예제에서는 함수 cdc.fn_cdc_get_net_changes_HR_Department 를 사용하여 특정 시간 간격 동안 원본 테이블에 HumanResources.Department 대한 순 변경 내용을 보고합니다.

먼저 GETDATE 함수를 사용하여 시간 간격의 시작을 표시합니다. 원본 테이블에 GETDATE 여러 DML 문을 적용한 후 함수가 다시 호출되어 시간 간격의 끝을 식별합니다. 그런 다음 sys.fn_cdc_map_time_to_lsn 함수를 사용하여 시간 간격을 LSN 값으로 바인딩된 변경 데이터 캡처 쿼리 범위에 매핑합니다. 마지막으로 함수를 cdc.fn_cdc_get_net_changes_HR_Department 쿼리하여 시간 간격에 대한 원본 테이블의 순 변경 내용을 가져옵니다. 삽입된 후 삭제된 행은 함수가 반환하는 결과 집합에 나타나지 않습니다. 이는 쿼리 창 내에서 먼저 추가된 다음 삭제된 행이 해당 간격에 대한 원본 테이블에서 순 변경을 생성하지 않으므로 발생합니다.

참고 항목

이 예제를 실행하기 전에 먼저 sys.sp_cdc_enable_table(Transact-SQL)에서 예제 B를 실행하여 테이블에서 HumanResources.DepartmentCDC를 사용하도록 설정해야 합니다. 아래 예제에서 HR_Department 에 지정된 sys.sp_cdc_enable_table대로 CDC 캡처 인스턴스의 이름입니다.

USE AdventureWorks2022;  
GO  
DECLARE @begin_time datetime, @end_time datetime, @from_lsn binary(10), @to_lsn binary(10);  
-- Obtain the beginning of the time interval.  
SET @begin_time = DATEADD(day, -1, GETDATE()) ;  
-- DML statements to produce changes in the HumanResources.Department table.  
INSERT INTO HumanResources.Department (Name, GroupName)  
VALUES (N'MyDept', N'MyNewGroup');  
  
UPDATE HumanResources.Department  
SET GroupName = N'Resource Control'  
WHERE GroupName = N'Inventory Management';  
  
DELETE FROM HumanResources.Department  
WHERE Name = N'MyDept';  
  
-- Obtain the end of the time interval.  
SET @end_time = GETDATE();  
-- Map the time interval to a change data capture query range.  
SET @from_lsn = sys.fn_cdc_map_time_to_lsn('smallest greater than or equal', @begin_time);  
SET @from_lsn = ISNULL(sys.fn_cdc_map_time_to_lsn('smallest greater than or equal', @begin_time), [sys].[fn_cdc_get_min_lsn]('HR_Department') );
SET @to_lsn = sys.fn_cdc_map_time_to_lsn('largest less than or equal', @end_time);  
  
-- Return the net changes occurring within the query window.  
SELECT * FROM cdc.fn_cdc_get_net_changes_HR_Department(@from_lsn, @to_lsn, 'all');  

참고 항목