CHANGETABLE (Transact-SQL)

適用対象: はいSQL Server (サポートされているすべてのバージョン) はいAzure SQL データベース

テーブルの変更追跡情報を返します。 このステートメントを使用して、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 ] )  

引数

CHANGES table_name 、last_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、 データベース用に構成された保有期間に従って一部またはすべての変更情報がクリーンアップされた可能性があるため、古すぎすぎずに検証する必要があります。 詳細については、「Transact-CHANGE_TRACKING_MIN_VALID_VERSION (」および「TRANSact-SQL) ALTER DATABASE SET オプション」を(参照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 SQL Server 2017 (14.x) SQL Server 2019 (15.x) CU16、CU24、CU11)、、、 Azure SQL データベース および Azure SQL Managed Instance

必要に応じて、シーク操作を強制的に使用して、 にアクセス table_name。 変更された行が非常に少ない場合でも、スキャン操作を使用してデータ にアクセス table_name。 スキャン操作でパフォーマンスの問題が発生する場合は、 パラメーターを使用 FORCESEEK します。

[AS] table_alias [( column_alias ] ,...n ] ) ]
CHANGETABLE によって返される結果の名前を提供します。

table_alias
CHANGETABLE によって返されるテーブルの別名を指定します。 table_alias 必須であり、有効な識別子 である必要 があります

column_alias
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列を一覧表示します。 計算列は変更された列として表示されません。

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

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

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

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

CHANGETABLE バージョン

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

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

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

注釈

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

CHANGETABLE(CHANGES...)

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

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

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

列と 列に対して返される値は、指定された基準 SYS_CHANGE_OPERATION SYS_CHANGE_COLUMNS (last_sync_version) に対して相対的です。 たとえば、バージョンで挿入操作が行われた場合、およびバージョン で更新操作が行われた場合、基準の値が last_sync_version場合、更新 10 15 12 プログラムが報告されます。 値が last_sync_version 8 の場合は、挿入が報告されます。 SYS_CHANGE_COLUMNS では、計算列は更新された列として報告されません。

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

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

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

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

CHANGETABLE(VERSION...)

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

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

アクセス許可

変更の追跡情報を取得するには、主キー列に対する権限と、<table_name>値で指定されたテーブルに対する権限 SELECT 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)