次の方法で共有


CHANGETABLE (Transact-SQL)

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

トピック リンク アイコン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
      変更箇所を取得するユーザー定義テーブルを指定します。テーブルで変更の追跡が有効になっている必要があります。1 つ、2 つ、3 つ、または 4 つの部分で構成されるテーブル名を使用できます。テーブルのシノニムを使用することもできます。

    • 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
      変更追跡情報を取得するユーザー定義テーブルを指定します。テーブルで変更の追跡が有効になっている必要があります。1 つ、2 つ、3 つ、または 4 つの部分で構成されるテーブル名を使用できます。テーブルのシノニムを使用することもできます。

    • 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 = 更新

I = 挿入

D = 削除

SYS_CHANGE_COLUMNS

varbinary(4100)

ベースライン バージョン以降に変更された列の一覧です。

注意
計算列が変更された列として表示されることはありません。

以下の場合は値が NULL になります。

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

  • 操作が挿入操作または削除操作の場合。

  • すべての非主キー列が 1 回の操作で更新された場合。このバイナリ値を直接解釈しないでください。この値を解釈するには、代わりに CHANGE_TRACKING_IS_COLUMN_IN_MASK() を使用します。

SYS_CHANGE_CONTEXT

varbinary(128)

INSERT、UPDATE、DELETE の各ステートメントの一部として WITH 句を使用することによってオプションで指定できる変更のコンテキスト情報です。

<主キー列の値>

ユーザー テーブルの列と同じ

追跡対象テーブルの主キーの値です。これらの値により、ユーザー テーブルの各行が一意に識別されます。

CHANGETABLE VERSION

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 列に対して返される値では、指定したベースライン バージョンが基準になります。たとえば、バージョン 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

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