CHANGETABLE(Transact-SQL)
적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance
테이블에 대한 변경 내용 추적 정보를 반환합니다. 이 문을 사용하여 테이블의 모든 변경 내용을 반환하거나 특정 행에 대한 변경 내용 추적 정보를 반환할 수 있습니다.
구문
CHANGETABLE (
{ CHANGES <table_name> , <last_sync_version>
| VERSION <table_name> , <primary_key_values> }
, [ FORCESEEK ]
)
[AS] <table_alias> [ ( <column_alias> [ ,...n ] )
<primary_key_values> ::=
( <column_name> [ , ...n ] ) , ( <value> [ , ...n ] )
인수
변경 table_name , last_sync_version
last_sync_version 지정한 버전 이후 발생한 테이블의 모든 변경 내용에 대한 추적 정보를 반환합니다.
table_name
추적된 변경 내용을 가져올 사용자 정의 테이블입니다. 테이블에서 변경 내용 추적을 사용하도록 설정해야 합니다. 1부, 2부, 3부 또는 4부로 구성된 테이블 이름을 사용할 수 있습니다. 테이블 이름은 테이블의 동의어일 수 있습니다.
last_sync_version
nullable bigint 스칼라 값입니다 . 식으로 인해 구문 오류가 발생합니다. 값이 NULL이면 추적된 모든 변경 내용이 반환됩니다.
변경 내용을 가져올 때 호출 애플리케이션은 변경이 필요한 지점을 지정해야 합니다. last_sync_version 해당 지점을 지정합니다. 이 함수는 해당 버전 이후 변경된 모든 행에 대한 정보를 반환합니다. 애플리케이션이 last_sync_version보다 큰 버전으로 변경 내용을 수신하도록 쿼리하고 있습니다.
일반적으로 변경 내용을 가져오기 전에 애플리케이션은 다음에 변경이 필요할 때 사용할 버전을 가져오기 위해 호출 CHANGE_TRACKING_CURRENT_VERSION()
합니다. 따라서 애플리케이션은 실제 값을 해석하거나 이해할 필요가 없습니다. 호출하는 애플리케이션에서 last_sync_version 가져오기 때문에 애플리케이션은 값을 유지해야 합니다. 애플리케이션에서 이 값을 손실하면 데이터를 다시 초기화해야 합니다.
데이터베이스에 대해 구성된 보존 기간에 따라 일부 또는 모든 변경 정보가 정리되었을 수 있으므로 last_sync_version 유효성을 검사하여 너무 오래되지 않았는지 확인해야 합니다. 자세한 내용은 CHANGE_TRACKING_MIN_VALID_VERSION(Transact-SQL) 및 ALTER DATABASE SET 옵션(Transact-SQL)을 참조하세요.
VERSION table_name, { primary_key_values }
지정된 행에 대한 최신 변경 내용 추적 정보를 반환합니다. 기본 키 값은 행을 식별해야 합니다. primary_key_values 기본 키 열을 식별하고 값을 지정합니다. 기본 키 열 이름은 순서에 따라 지정할 수 있습니다.
table_name
변경 내용 추적 정보를 가져올 사용자 정의 테이블입니다. 테이블에서 변경 내용 추적을 사용하도록 설정해야 합니다. 1부, 2부, 3부 또는 4부로 구성된 테이블 이름을 사용할 수 있습니다. 테이블 이름은 테이블의 동의어일 수 있습니다.
column_name
기본 키 열 또는 열의 이름을 지정합니다. 순서에 따라 여러 열 이름을 지정할 수 있습니다.
value
기본 키의 값입니다. 여러 기본 키 열이 있는 경우 열이 column_name 목록에 표시되는 순서와 동일한 순서로 값을 지정해야 합니다.
[ FORCESEEK ]
적용 대상: SQL Server(SQL Server 2016(13.x) SP2 CU16, SQL Server 2017(14.x) CU24 및 SQL Server 2019(15.x) CU11부터), Azure SQL Database 및 Azure SQL Managed Instance
검색 작업을 강제로 사용하여 table_name 액세스하는 선택적 매개 변수입니다. 행이 거의 변경되지 않은 경우에도 검사 작업을 사용하여 table_name 액세스할 수 있습니다. 검사 작업으로 인해 성능 문제가 발생할 경우 매개 변수를 FORCESEEK
사용합니다.
[AS] table_alias [ (column_alias [ ,...n ] ) ]
CHANGETABLE에서 반환하는 결과의 이름을 제공합니다.
table_alias
CHANGETABLE에서 반환되는 테이블의 별칭 이름입니다. table_alias 필수이며 유효한 식별자여야 합니다.
column_alias
CHANGETABLE에서 반환하는 열에 대한 선택적 열 별칭 또는 열 별칭의 목록입니다. 결과에 중복 이름이 있는 경우 열 이름을 사용자 지정할 수 있습니다.
반환 형식
table
반환 값
CHANGETABLE 변경 내용
CHANGES를 지정하면 다음 열이 있는 0개 이상의 행이 반환됩니다.
열 이름 | 데이터 형식 | 설명 |
---|---|---|
SYS_CHANGE_VERSION | bigint | 행의 마지막 변경 내용과 연결된 버전 값 |
SYS_CHANGE_CREATION_VERSION | bigint | 마지막 삽입 작업과 연결된 버전 값입니다. |
SYS_CHANGE_OPERATION | nchar(1) | 다음과 같은 변경 형식을 지정합니다. U = 업데이트 I = Insert D = 삭제 |
SYS_CHANGE_COLUMNS | varbinary(4100) | last_sync_version 이후 변경된 열(기준선)을 나열합니다. 계산 열은 변경된 것으로 나열되지 않습니다. 다음 조건 중 하나가 true인 경우 값은 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_COLUMNS
대해 SYS_CHANGE_OPERATION
반환되는 값은 지정된 기준선(last_sync_version)을 기준으로 합니다. 예를 들어 버전에서 삽입 작업이 수행되고 버전 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일 수 있습니다.
사용 권한
SELECT
변경 내용 추적 정보를 가져오려면 기본 키 열에 대한 사용 권한과 VIEW CHANGE TRACKING
table_name> 값으로 <지정된 테이블에 대한 권한이 필요합니다.
예제
A. 데이터의 초기 동기화를 위한 행 반환
다음 예제에서는 테이블 데이터의 초기 동기화에 대한 데이터를 가져오는 방법을 보여 줍니다. 쿼리는 모든 행 데이터 및 연관된 버전을 반환합니다. 그런 다음 동기화된 데이터를 포함할 시스템에 이 데이터를 삽입하거나 추가할 수 있습니다.
-- 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;
B. 특정 버전 이후의 모든 변경 내용 나열
다음 예에서는 지정된 버전(@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;
C. 동기화를 위해 변경된 모든 데이터 가져오기
다음 예에서는 변경된 모든 데이터를 가져오는 방법을 보여 줍니다. 이 쿼리는 사용자 테이블 정보가 반환되도록 변경 내용 추적 정보를 사용자 테이블과 조인합니다. 삭제된 행에 대해 행이 반환되도록 A 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;
D. 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);
참고 항목
변경 내용 추적 함수(Transact-SQL)
데이터 변경 내용 추적(SQL Server)
CHANGE_TRACKING_IS_COLUMN_IN_MASK(Transact-SQL)
CHANGE_TRACKING_CURRENT_VERSION(Transact-SQL)
CHANGE_TRACKING_MIN_VALID_VERSION(Transact-SQL)