CHANGETABLE(Transact-SQL)

테이블에 대한 변경 내용 추적 정보를 반환합니다. 이 문을 사용하여 테이블에 대한 모든 변경 내용이나 특정 행에 대한 변경 내용 추적 정보를 반환할 수 있습니다.

항목 링크 아이콘Transact-SQL 구문 표기 규칙

구문

CHANGETABLE (
        { CHANGES table , last_sync_version
        | VERSION table , <primary_key_values> } )
[AS] table_alias [ ( column_alias [ ,...n ] )

<primary_key_values> ::=
( column_name [ , ...n ] ) , ( value [ , ...n ] )

인수

  • CHANGES table , last_sync_version
    last_sync_version에서 지정한 버전 이후에 발생한 모든 변경 내용에 대한 추적 정보를 테이블에 반환합니다.

    • table
      추적된 변경 내용을 가져올 사용자 정의 테이블입니다. 테이블에서 변경 내용 추적을 사용할 수 있어야 합니다. 한 부분, 두 부분, 세 부분 또는 두 부분으로 이루어진 테이블 이름을 사용할 수 있습니다. 테이블 이름은 테이블에 대한 동의어가 될 수 있습니다.

    • last_sync_version
      변경 내용을 가져올 때 호출 응용 프로그램은 변경 내용이 필요한 지점을 지정해야 합니다. last_sync_version은 이러한 지점을 지정합니다. 이 함수는 해당 버전 이후 변경된 모든 행에 대한 정보를 반환합니다. 응용 프로그램은 last_sync_version 이후 버전의 변경 내용을 쿼리하여 받습니다.

      일반적으로 변경 내용을 가져오기 전에 응용 프로그램이 CHANGE_TRACKING_CURRENT_VERSION()을 호출하여 다음에 변경 내용이 필요할 때 사용할 버전을 가져옵니다. 따라서 응용 프로그램은 실제 값을 해석하거나 이해할 필요가 없습니다.

      호출 응용 프로그램에서 last_sync_version을 가져오므로 응용 프로그램은 값을 유지해야 합니다. 응용 프로그램에서 이 값을 손실하면 데이터를 다시 초기화해야 합니다.

      .

      last_sync_version은 bigint입니다. 값은 스칼라여야 합니다. 식은 구문 오류를 야기합니다.

      값이 NULL이면 추적되는 모든 변경 내용이 반환됩니다.

      일부 또는 모든 변경 정보가 데이터베이스에 대해 구성된 보존 기간에 따라 정리되었으므로 last_sync_version이 너무 오래되지 않았는지 유효성을 확인해야 합니다. 자세한 내용은 CHANGE_TRACKING_MIN_VALID_VERSION(Transact-SQL)ALTER DATABASE SET 옵션(Transact-SQL)을 참조하십시오.

  • VERSION table, { <primary_key_values> }
    지정된 열에 대한 최신 변경 내용 추적 정보를 반환합니다. 기본 키 값은 행을 식별해야 합니다. <primary_key_values>는 기본 키 열을 식별하고 값을 지정합니다. 기본 키 열 이름은 지정되는 순서에 제한을 받지 않습니다.

    • Table
      변경 내용 추적 정보를 가져올 사용자 정의 테이블입니다. 테이블에서 변경 내용 추적을 사용할 수 있어야 합니다. 한 부분, 두 부분, 세 부분 또는 두 부분으로 이루어진 테이블 이름을 사용할 수 있습니다. 테이블 이름은 테이블에 대한 동의어가 될 수 있습니다.

    • column_name
      기본 키 열의 이름을 지정합니다. 여러 열 이름은 지정되는 순서에 제한을 받지 않습니다.

    • Value
      기본 키의 값입니다. 여러 기본 키 열이 있으면 열이 column_name 목록에 표시되는 열과 같은 순서로 값을 지정해야 합니다.

  • [AS] table_alias [ (column_alias [ ,...n ] ) ]
    CHANGETABLE에서 반환하는 결과의 이름을 제공합니다.

    • table_alias
      CHANGETABLE에서 반환하는 테이블의 별칭 이름입니다. table_alias이 필요하고 유효한 식별자여야 합니다.

    • column_alias
      CHANGETABLE에서 반환하는 열에 대한 선택적 열 별칭 또는 열 별칭의 목록입니다. 결과에 중복 이름이 있는 경우 열 이름을 사용자 지정할 수 있습니다.

반환 형식

table

반환 값

CHANGETABLE CHANGES

CHANGES를 지정하면 다음 열이 있는 0개 이상의 행이 반환됩니다.

열 이름

데이터 형식

설명

SYS_CHANGE_VERSION

bigint

행의 마지막 변경 내용과 연관된 버전 값입니다.

SYS_CHANGE_CREATION_VERSION

bigint

마지막 삽입 작업과 연관된 버전 값입니다.

SYS_CHANGE_OPERATION

nchar(1)

다음과 같은 변경 형식을 지정합니다.

U = Update

I = Insert

D = Delete

SYS_CHANGE_COLUMNS

varbinary(4100)

기준 버전 이후에 변경된 열을 나열합니다.

참고참고
계산 열은 변경된 열로 나열되지 않습니다.

다음 조건 중 하나가 충족되는 경우 값은 NULL입니다.

  • 열 변경 내용 추적을 사용할 수 없는 경우

  • 작업이 삽입 또는 삭제 작업인 경우

  • 모든 비기본 키 열이 단일 작업에서 업데이트된 경우 이 이진 값을 직접 해석하면 안 되는 경우. 이 이진 값을 해석하려면 CHANGE_TRACKING_IS_COLUMN_IN_MASK()를 사용합니다.

SYS_CHANGE_CONTEXT

varbinary(128)

WITH 절을 INSERT, UPDATE 또는 DELETE 문의 일부로 사용하여 선택적으로 지정할 수 있는 컨텍스트 정보를 변경합니다.

<<기본 키 열 값>>

사용자 테이블 열과 같음

추적된 테이블의 기본 키 값입니다. 이러한 값은 사용자 테이블의 각 행을 고유하게 식별합니다.

CHANGETABLE VERSION

VERSION을 지정하면 다음 열이 있는 하나의 행이 반환됩니다.

열 이름

데이터 형식

설명

SYS_CHANGE_VERSION

bigint

행과 연관된 현재 변경 버전 값입니다.

변경 내용 추적 보존 기간보다 긴 기간 동안 변경된 내용이 없거나 변경 내용 추적이 사용된 이후 변경된 행이 없을 경우 이 값은 NULL입니다.

SYS_CHANGE_CONTEXT

varbinary(128)

WITH 절을 INSERT, UPDATE 또는 DELETE 문의 일부로 사용하여 선택적으로 지정할 수 있는 컨텍스트 정보를 변경합니다.

<<기본 키 열 값>>

사용자 테이블 열과 같음

추적된 테이블의 기본 키 값입니다. 이러한 값은 사용자 테이블의 각 행을 고유하게 식별합니다.

주의

CHANGETABLE 함수는 일반적으로 쿼리의 FROM 절에서 테이블인 것처럼 사용할 수 있습니다.

CHANGETABLE(CHANGES...)

새 행이나 수정된 행의 행 데이터를 가져오려면 기본 키 열을 사용하여 사용자 테이블에 결과 세트를 조인합니다. last_sync_version 값 이후 같은 행에 여러 변경 내용이 있는 경우에도 변경된 사용자 테이블의 각 행에 대해 한 개의 행만 반환됩니다.

기본 키 열 변경 내용은 절대 업데이트로 표시되지 않습니다. 기본 키 값이 변경되면 이전 값의 삭제 및 새 값의 삽입으로 고려됩니다.

행을 삭제한 다음 이전 기본 키가 있는 행을 삽입하면 변경 내용이 행의 모든 열에 대한 업데이트로 표시됩니다.

SYS_CHANGE_OPERATION 및 SYS_CHANGE_COLUMNS 열에 대해 반환된 값은 지정된 기준 버전에 따라 바뀝니다. 예를 들어 버전 10에서 삽입 작업이 수행되고 버전 15에서 업데이트 작업이 수행될 경우 및 기준 last_sync_version이 12인 경우 업데이트가 보고됩니다. last_sync_version 값이 8이면 삽입이 보고됩니다. SYS_CHANGE_COLUMNS는 계산 열을 업데이트된 것으로 보고하지 않습니다.

일반적으로 MERGE 문을 비롯하여 사용자 테이블에서 데이터를 삽입, 업데이트 또는 삭제하는 모든 작업은 추적됩니다.

사용자 테이블 데이터에 영향을 미치는 다음 작업은 추적되지 않습니다.

  • UPDATETEXT 문 실행

    이 문은 더 이상 사용되지 않으며 SQL Server의 이후 버전에서는 제거될 예정입니다. 그러나 UPDATE 문의 WRITE 절을 사용하여 적용된 변경 사항은 추적됩니다.

  • TRUNCATE TABLE을 사용하여 행 삭제

    테이블이 잘리면 변경 내용 추적이 테이블에 설정된 것처럼 이 테이블과 연관된 변경 내용 추적 버전 정보가 다시 설정됩니다. 클라이언트 응용 프로그램에서는 항상 마지막 동기화된 버전의 유효성을 검사해야 합니다. 테이블이 잘린 경우 유효성 검사에 실패합니다.

CHANGETABLE(VERSION...)

존재하지 않는 기본 키를 지정하면 빈 결과 집합이 반환됩니다.

보존 기간보다 긴 기간 동안 정리 프로세스가 변경 정보를 제거하는 등의 변경된 내용이 없거나 테이블에 대해 변경 내용 추적을 설정한 이후 변경된 행이 없을 경우 SYS_CHANGE_VERSION 값은 NULL일 수 있습니다.

사용 권한

변경 내용 추적 정보를 가져오려면 table 값에서 지정한 테이블에 다음 권한이 필요합니다.

  • 기본 키 열의 SELECT 권한

  • VIEW CHANGE TRACKING

1. 데이터의 초기 동기화에 대한 행 반환

다음 예제에서는 테이블 데이터의 초기 동기화에 대한 데이터를 가져오는 방법을 보여 줍니다. 쿼리는 모든 행 데이터 및 연관된 버전을 반환합니다. 그러면 동기화된 데이터를 포함하는 시스템에 이 데이터를 추가하거나 삽입할 수 있습니다.

-- Get all current rows with associated version
SELECT e.[Emp ID], e.SSN, e.FirstName, e.LastName,
    c.SYS_CHANGE_VERSION, c.SYS_CHANGE_CONTEXT
FROM Employees AS e
CROSS APPLY CHANGETABLE 
    (VERSION Employees, ([Emp ID], SSN), (e.[Emp ID], e.SSN)) AS c;

2. 특정 버전 이후의 모든 변경 내용 나열

다음 예에서는 지정된 버전(@last_sync_version) 이후에 테이블의 모든 변경 내용을 나열합니다. [Emp ID] 및 SSN은 복합 기본 키에 있는 열입니다.

DECLARE @last_sync_version bigint;
SET @last_sync_version = <value obtained from query>;
SELECT [Emp ID], SSN,
    SYS_CHANGE_VERSION, SYS_CHANGE_OPERATION,
    SYS_CHANGE_COLUMNS, SYS_CHANGE_CONTEXT 
FROM CHANGETABLE (CHANGES Employees, @last_sync_version) AS C;

3. 동기화를 위해 변경된 모든 데이터 가져오기

다음 예에서는 변경된 모든 데이터를 가져오는 방법을 보여 줍니다. 이 쿼리는 변경 내용 추적 정보를 사용자 테이블과 조인하여 사용자 테이블 정보가 반환되게 합니다. 삭제된 행에 대해 하나의 행이 반환되도록 LEFT OUTER JOIN이 사용됩니다.

-- Get all changes (inserts, updates, deletes)
DECLARE @last_sync_version bigint;
SET @last_sync_version = <value obtained from query>;
SELECT e.FirstName, e.LastName, c.[Emp ID], c.SSN,
    c.SYS_CHANGE_VERSION, c.SYS_CHANGE_OPERATION,
    c.SYS_CHANGE_COLUMNS, c.SYS_CHANGE_CONTEXT 
FROM CHANGETABLE (CHANGES Employees, @last_sync_version) AS c
    LEFT OUTER JOIN Employees AS e
        ON e.[Emp ID] = c.[Emp ID] AND e.SSN = c.SSN;

4. CHANGETABLE(VERSION...)을 사용하여 충돌 검색

다음 예에서는 행에 마지막 동기화 이후의 변경 내용이 없는 경우에만 행을 업데이트하는 방법을 보여 줍니다. 특정 행의 버전 번호는 CHANGETABLE을 사용하여 얻습니다. 행이 업데이트되었으면 변경 내용이 적용되지 않으며 쿼리가 행의 최근 변경 내용에 대한 정보를 반환합니다.

-- @last_sync_version must be set to a valid value
UPDATE
    SalesLT.Product
SET
    ListPrice = @new_listprice
FROM
    SalesLT.Product AS P
WHERE
    ProductID = @product_id AND
    @last_sync_version >= ISNULL (
        (SELECT CT.SYS_CHANGE_VERSION FROM 
            CHANGETABLE(VERSION SalesLT.Product,
            (ProductID), (P.ProductID)) AS CT),
        0);