CHANGETABLE (Transact-SQL)

適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance

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

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 ] )  

引数

CHANGES table_name , last_sync_version
last_sync_versionで指定されたバージョン以降に発生したテーブルに対するすべての変更の追跡情報を返します。

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

last_sync_version
null 許容 bigint スカラー値。 expressionは構文エラーを引き起こします。 値が 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 は必須であり、有効な identifierである必要があります。

column_alias
CHANGETABLE によって返される列の省略可能な列エイリアスまたは列エイリアスのリストです。 これにより、結果に重複する名前がある場合に、列名をカスタマイズできます。

戻り値の型

テーブル

戻り値

CHANGETABLE の変更

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

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

U = 更新

I = Insert

D = Delete
SYS_CHANGE_COLUMNS varbinary(4100) last_sync_version (ベースライン) 以降に変更された列を一覧表示します。 計算列が変更済みとして表示されることはありません。

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

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

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

1 回の操作で、すべての非primary キー列が更新されました。 このバイナリ値を直接解釈しないでください。 代わりに、 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_OPERATION列とSYS_CHANGE_COLUMNS列に対して返される値は、指定されたベースライン (last_sync_version) に対して相対的です。 たとえば、挿入操作がバージョン 10 で行われ、更新操作がバージョン 15で行われた場合、ベースライン last_sync_version12されると、更新プログラムが報告されます。 last_sync_version値が8場合は、挿入が報告されます。 SYS_CHANGE_COLUMNS では、計算列が更新されたと報告されることはありません。

一般に、ユーザー テーブルに対するデータの挿入、更新、または削除の操作は、MERGE ステートメントも含め、すべて追跡されます。

ユーザー テーブルのデータに影響する操作のうち、追跡されない操作は次のとおりです。

  • UPDATETEXT ステートメントの実行。 このステートメントは非推奨となり、今後のバージョンの SQL Server で削除される予定です。 ただし、UPDATE ステートメントの .WRITE 句を使用して行われた変更は追跡されます。

  • TRUNCATE TABLEを使用して行を削除する。 テーブルが切り捨てられると、テーブルに関連付けられている変更追跡バージョン情報はリセットされ、変更の追跡を有効にした直後と同じ状態になります。 クライアント アプリケーションでは、常に最後に同期されたバージョンを検証する必要があります。 テーブルが切り捨てられた場合、検証は失敗します。

CHANGETABLE(VERSION...)

存在しない主キーが指定されている場合は、空の結果セットが返されます。

SYS_CHANGE_VERSIONの値は、保持期間より長く変更が行われなかった場合 (クリーンアップによって変更情報が削除された場合など)、またはテーブルの変更追跡が有効になってから行が変更されていない場合に NULL になる可能性があります。

アクセス許可

変更追跡情報を取得するには、主キー列に対するSELECT権限と、<table_name>値で指定されたテーブルに対するVIEW CHANGE TRACKING権限が必要です。

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)