CHANGETABLE (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

テーブルの変更追跡情報を返します。 このステートメントを使用して、1 つのテーブルのすべての変更または特定の行の変更追跡情報を返すことができます。

Transact-SQL 構文表記規則

構文

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_namelast_sync_version
last_sync_versionで指定されたバージョン以降に発生したテーブルに対するすべての変更の追跡情報 返します。

table_name
変更履歴を取得するユーザー定義テーブルです。 テーブルで変更の追跡を有効にする必要があります。 1 つ、2 つ、3 つ、または 4 つの部分で構成されるテーブル名を使用できます。 テーブル名には、テーブルのシノニムを指定できます。

last_sync_version
null 許容 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 Options (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 によって返される列のオプションの列エイリアスまたは列エイリアスの一覧です。 これにより、結果に重複する名前がある場合に備えて、列名をカスタマイズできます。

戻り値の型

テーブル

戻り値

CHANGETABLE の変更

CHANGES を指定すると、次の列を含む 0 以上の行が返されます。

列名 データ型 説明
SYS_CHANGE_VERSION bigint 行の最後の変更に関連付けられているバージョン値
SYS_CHANGE_CREATION_VERSION bigint 最後の挿入操作に関連付けられているバージョン値。
SYS_CHANGE_OPERATION nchar(1) 変更の種類を示します。

U = 更新

I = 挿入

D = 削除
SYS_CHANGE_COLUMNS varbinary(4100) last_sync_version (ベースライン) 以降に変更された列を一覧表示します。 計算列は変更済みとして一覧表示されない点に注意してください。

次のいずれかの条件に該当する場合、値は NULL です。

列の変更の追跡が有効になっていない場合。

操作は挿入操作または削除操作です。

すべての非特権キー列が 1 回の操作で更新されました。 このバイナリ値を直接解釈しないでください。 代わりに、解釈するには 、CHANGE_TRACKING_IS_COLUMN_IN_MASK()を使用します。
SYS_CHANGE_CONTEXT varbinary (128) INSERT、UPDATE、または DELETE ステートメントの一部として WITH 句を使用して、必要に応じて指定できるコンテキスト情報を変更します。
<主キー列の値> ユーザー テーブルの列と同じ 追跡対象テーブルの主キー値。 これらの値は、ユーザー テーブルの各行を一意に識別します。

CHANGETABLE バージョン

VERSION を指定すると、次の列を含む 1 つの行が返されます。

列名 データ型 説明
SYS_CHANGE_VERSION bigint 行に関連付けられている現在のバージョン変更の値。

変更履歴の保持期間より長い期間変更が行われなかった場合、または変更追跡が有効になった後に行が変更されていない場合、値は NULL です。
SYS_CHANGE_CONTEXT varbinary (128) INSERT、UPDATE、DELETE の各ステートメントの一部として WITH 句を使用することによってオプションで指定できる変更のコンテキスト情報です。
<主キー列の値> ユーザー テーブルの列と同じ 追跡対象テーブルの主キー値。 これらの値は、ユーザー テーブルの各行を一意に識別します。

解説

CHANGETABLE 関数は、クエリの FROM 句の中でテーブルとして使用されるのが一般的です。

CHANGETABLE(CHANGES...)

新規または変更された行の行データを取得するには、主キー列を使用して結果セットをユーザー テーブルに結合します。 last_sync_version値以降に同じ行に対して複数の変更があった場合でも、変更されたユーザー テーブルの各行に対して 1 つの行のみが返されます。

主キー列の変更は更新としてマークされません。 主キー値が変更された場合、古い値の削除と新しい値の挿入と見なされます。

行を削除し、古い主キーを持つ行を挿入すると、変更は行内のすべての列の更新と見なされます。

列と SYS_CHANGE_COLUMNS 列に対してSYS_CHANGE_OPERATION返される値は、指定されたベースライン (last_sync_version) に対して相対的です。 たとえば、バージョンで挿入操作が行われ、バージョン1015で更新操作が行われた場合、ベースライン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. 同期のために変更されたすべてのデータを取得する

次の例は、変更されたデータをすべて取得する方法を示しています。 このクエリでは、変更追跡情報をユーザー テーブルと結合して、ユーザー テーブルの情報が返されるようにしています。 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)