다음을 통해 공유


cdc.fn_cdc_get_net_changes_<capture_instance>(Transact-SQL)

지정한 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 with mask | all with merge }
    결과 집합에 반환되는 행과 메타데이터 열의 내용을 제어하는 옵션입니다. 다음 옵션 중 하나를 사용할 수 있습니다.

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

    • all with mask
      행에 대한 마지막 변경의 LSN과 메타데이터 열 __$start_lsn 및 __$operation에 해당 행을 적용하는 데 필요한 작업을 반환합니다. 또한 업데이트 작업이 (__$operation = 4)를 반환하는 경우 업데이트에서 수정된 캡처된 열은 __$update_mask에 반환된 값에 표시됩니다.

    • all with merge
      메타데이터 열 __$start_lsn에서 해당 행의 마지막 변경에 대한 LSN을 반환합니다. __$operation 열은 두 값 중 하나입니다. 1은 삭제이며, 5는 변경을 적용하는 데 필요한 작업이 삽입 또는 업데이트 중 하나임을 나타냅니다. __$update_mask 열은 항상 NULL입니다.

      지정된 변경에 대한 정확한 작업을 확인하는 논리를 사용하면 쿼리의 복잡성이 가중되므로 경우에 따라 이 옵션을 통해 쿼리 성능을 향상시킬 수 있습니다. 변경 데이터를 적용하는 데 필요한 작업이 삽입 또는 업데이트 중 하나임을 나타내는 것으로 충분하여 두 작업을 명시적으로 구별할 필요가 없을 경우가 이에 속합니다. 이 옵션은 SQL Server 2008 환경과 같이 병합 작업을 직접 사용할 수 있는 대상 환경에 가장 유용합니다.

반환된 테이블

열 이름

데이터 형식

설명

__$start_lsn

binary(10)

변경에 대한 커밋 트랜잭션과 연관된 LSN입니다.

동일한 트랜잭션에서 커밋된 변경의 커밋 LSN은 모두 동일합니다. 예를 들어 원본 테이블의 업데이트 작업에서 두 행의 두 열이 수정된 경우 변경 테이블은 동일한 __$start_lsn 값을 가진 4개 행을 포함합니다.

__$seqval

binary(10)

트랜잭션 내 행 변경을 정렬하는 데 사용되는 시퀀스 값입니다.

__$operation

int

변경 데이터의 행을 대상 데이터 원본에 적용하는 데 필요한 DML(데이터 조작 언어) 작업을 식별합니다.

row_filter_option 매개 변수의 값이 all 또는 all with mask일 경우 이 열의 값은 다음 값 중 하나일 수 있습니다.

1 = 삭제

2 = 삽입

4 = 업데이트

row_filter_option 매개 변수의 값이 all with merge일 경우 이 열의 값은 다음 값 중 하나일 수 있습니다.

1 = 삭제

5 = 삽입 또는 업데이트

값 5는 행이 이미 있어 업데이트만 하면 되는지 여부나 현재 행이 없기 때문에 삽입해야 하는지 여부를 알 수 없음을 나타냅니다.

__$update_mask

varbinary(128)

캡처 인스턴스에 대해 식별된 각 캡처된 열에 해당하는 비트가 있는 비트 마스크입니다. 이 값에는 __$operation이 1 또는 2인 경우 모두 1로 설정되는 정의된 비트가 있습니다. __$operation이 3 또는 4인 경우에는 변경된 열에 해당하는 비트만 1로 설정됩니다.

<captured source table columns>

다양함

함수에서 반환되는 나머지 열은 캡처 인스턴스 생성 시 캡처된 열로 식별된 원본 테이블의 열입니다. 캡처된 열 목록에 아무 열도 지정하지 않으면 원본 테이블의 모든 열이 반환됩니다.

사용 권한

sysadmin 고정 서버 역할 또는 db_owner 고정 데이터베이스 역할의 멤버여야 합니다. 다른 모든 사용자의 경우 원본 테이블에서 캡처된 모든 열에 대한 SELECT 권한이 필요하며 캡처 인스턴스에 대한 제어 역할이 정의된 경우 해당 데이터베이스 역할의 멤버 자격이 필요합니다. 호출자에게 원본 데이터를 볼 수 있는 권한이 없으면 함수는 오류 208(개체 이름이 잘못되었습니다)을 반환합니다.

주의

지정된 LSN 범위가 캡처 인스턴스에 대한 변경 추적 시간대를 벗어나는 경우 함수는 오류 208(개체 이름이 잘못되었습니다)을 반환합니다.

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

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

USE AdventureWorks;
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 = GETDATE() -1;
-- 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 @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');