CHANGETABLE (Transact-SQL)CHANGETABLE (Transact-SQL)

適用対象:Applies to: はいSQL ServerSQL Server (サポートされているすべてのバージョン) yesSQL ServerSQL Server (all supported versions) はいAzure SQL データベースAzure SQL DatabaseYesAzure SQL データベースAzure SQL Database適用対象:Applies to: はいSQL ServerSQL Server (サポートされているすべてのバージョン) yesSQL ServerSQL Server (all supported versions) はいAzure SQL データベースAzure SQL DatabaseYesAzure SQL データベースAzure SQL Database

テーブルの変更追跡情報を返します。このステートメントを使用すると、テーブルのすべての変更を返すことも、特定の行の変更追跡情報を取得することもできます。Returns change tracking information for a table.You can use this statement to return all changes for a table or change tracking information for a specific row.

トピック リンク アイコン Transact-SQL 構文表記規則Topic link icon Transact-SQL Syntax Conventions

構文Syntax

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

引数Arguments

変更 テーブルlast_sync_versionCHANGES table , last_sync_version
Last_sync_versionによって指定されたバージョン以降に発生したテーブルに対するすべての変更の追跡情報を返します。Returns tracking information for all changes to a table that have occurred since the version that is specified by last_sync_version.

テーブルtable
追跡した変更を取得するユーザー定義テーブルを指定します。Is the user-defined table on which to obtain tracked changes. テーブルで変更の追跡を有効にする必要があります。Change tracking must be enabled on the table. 1 つ、2 つ、3 つ、または 4 つの部分で構成されるテーブル名を使用できます。A one-, two-, three-, or four-part table name can be used. テーブル名は、テーブルのシノニムにすることができます。The table name can be a synonym to the table.

last_sync_versionlast_sync_version
変更を取得するときは、呼び出し元のアプリケーションで、変更が必要なポイントを指定する必要があります。When it obtains changes, the calling application must specify the point from which changes are required. last_sync_version は、その時点を指定します。The last_sync_version specifies that point. この関数により、そのバージョン以降に変更されたすべての行に関する情報が返されます。The function returns information for all rows that have been changed since that version. アプリケーションは、last_sync_version よりも大きいバージョンの変更を受信するようにクエリを実行しています。The application is querying to receive changes with a version greater than last_sync_version.

通常、変更を取得する前に、アプリケーションは CHANGE_TRACKING_CURRENT_VERSION () を呼び出して、次回の変更が必要になったときに使用されるバージョンを取得します。Typically, before it obtains changes, the application will call CHANGE_TRACKING_CURRENT_VERSION() to obtain the version that will be used the next time changes are required. そのため、アプリケーションは実際の値を解釈または理解する必要はありません。Therefore, the application does not have to interpret or understand the actual value.

last_sync_version は呼び出し元アプリケーションによって取得されるため、アプリケーションで値を保存する必要があります。Because last_sync_version is obtained by the calling application, the application has to persist the value. アプリケーションでこの値が失われた場合は、データを再初期化する必要があります。If the application loses this value then it will need to re-initialize data.

last_sync_versionbigintです。last_sync_version is bigint. 値はスカラーである必要があります。The value must be scalar. 式によって構文エラーが発生します。An expression will cause a syntax error.

値が NULL の場合は、追跡されたすべての変更が返されます。If the value is NULL, all tracked changes are returned.

変更情報の一部またはすべてが、データベース用に構成された保有期間に従ってクリーンアップされている可能性があるため、 last_sync_versionを検証して、古くなっていないことを確認する必要があります。last_sync_version should be validated to ensure that it is not too old, because some or all the change information might have been cleaned up according to the retention period configured for the database. 詳細については、「transact-sql )の (transact-sql の CHANGE_TRACKING_MIN_VALID_VERSION 」および「 ALTER DATABASE SET オプション (transact-sql)」を参照してください。For more information, see CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL) and ALTER DATABASE SET Options (Transact-SQL).

VERSION table, { <primary_key_values> }VERSION table, { <primary_key_values> }
指定された行の最新の変更追跡情報を返します。Returns the latest change tracking information for a specified row. 行は主キー値によって識別される必要があります。Primary key values must identify the row. <primary_key_values> は主キー列を識別し、値を指定します。<primary_key_values> identifies the primary key columns and specifies the values. 主キー列の名前は、任意の順序で指定できます。The primary key column names can be specified in any order.

TableTable
変更追跡情報を取得するユーザー定義テーブルを指定します。Is the user-defined table on which to obtain change tracking information. テーブルで変更の追跡を有効にする必要があります。Change tracking must be enabled on the table. 1 つ、2 つ、3 つ、または 4 つの部分で構成されるテーブル名を使用できます。A one-, two-, three-, or four-part table name can be used. テーブル名は、テーブルのシノニムにすることができます。The table name can be a synonym to the table.

column_namecolumn_name
主キー列の名前を指定します。Specifies the name of primary key column or columns. 複数の列名を任意の順序で指定できます。Multiple column names can be specified in any order.

ValueValue
主キーの値を指定します。Is the value of the primary key. 複数の主キー列がある場合は、 column_name リストに表示される列と同じ順序で値を指定する必要があります。If there are multiple primary key columns, the values must be specified in the same order as the columns appear in the column_name list.

table_alias [(column_alias [,...n ])][AS] table_alias [ (column_alias [ ,...n ] ) ]
CHANGETABLE によって返される結果の名前を提供します。Provides names for the results that are returned by CHANGETABLE.

table_aliastable_alias
CHANGETABLE によって返されるテーブルの別名を指定します。Is the alias name of the table that is returned by CHANGETABLE. table_alias は必須であり、有効な 識別子である必要があります。table_alias is required and must be a valid identifier.

column_aliascolumn_alias
CHANGETABLE によって返される列の別名または列の別名を指定します (省略可能)。Is an optional column alias or list of column aliases for the columns that are returned by CHANGETABLE. これにより、結果に重複する名前がある場合に備えて、列名をカスタマイズできます。This enables column names to be customized in case there are duplicate names in the results.

戻り値の型Return Types

テーブルtable

戻り値Return Values

CHANGETABLE の変更CHANGETABLE CHANGES

CHANGES を指定すると、次の列を含む 0 以上の行が返されます。When CHANGES is specified, zero or more rows that have the following columns are returned.

列名Column name データ型Data type 説明Description
SYS_CHANGE_VERSIONSYS_CHANGE_VERSION bigintbigint 行の最後の変更に関連付けられているバージョンの値Version value that is associated with the last change to the row
SYS_CHANGE_CREATION_VERSIONSYS_CHANGE_CREATION_VERSION bigintbigint 最後の挿入操作に関連付けられているバージョンの値。Version values that are associated with the last insert operation.
SYS_CHANGE_OPERATIONSYS_CHANGE_OPERATION nchar(1)nchar(1) 変更の種類を示します。Specifies the type of change:

U = 更新U = Update

I = 挿入I = Insert

D = 削除D = Delete
SYS_CHANGE_COLUMNSSYS_CHANGE_COLUMNS varbinary(4100)varbinary(4100) Last_sync_version (ベースライン) 以降に変更された列を一覧表示します。Lists the columns that have changed since the last_sync_version (the baseline). 計算列は、変更されたものとして表示されないことに注意してください。Note that computed columns are never listed as changed.

次のいずれかの条件に該当する場合、値は NULL になります。The value is NULL when any one of the following conditions is true:

列の変更の追跡が有効になっていない場合。Column change tracking is not enabled.

操作は挿入操作または削除操作です。The operation is an insert or delete operation.

すべての非プライマリキー列が1回の操作で更新されました。All nonprimary key columns were updated in one operation. このバイナリ値を直接解釈しないでください。This binary value should not be interpreted directly. 代わりに、を解釈するには、 CHANGE_TRACKING_IS_COLUMN_IN_MASK ()を使用します。Instead, to interpret it, use CHANGE_TRACKING_IS_COLUMN_IN_MASK().
SYS_CHANGE_CONTEXTSYS_CHANGE_CONTEXT varbinary (128)varbinary(128) 必要に応じて、INSERT、UPDATE、または DELETE ステートメントの一部として WITH 句を使用して指定できるコンテキスト情報を変更します。Change context information that you can optionally specify by using the WITH clause as part of an INSERT, UPDATE, or DELETE statement.
<primary key column value> ユーザーテーブルの列と同じSame as the user table columns 追跡対象テーブルの主キー値。The primary key values for the tracked table. これらの値は、ユーザーテーブル内の各行を一意に識別します。These values uniquely identify each row in the user table.

CHANGETABLE バージョンCHANGETABLE VERSION

VERSION を指定すると、次の列を含む 1 つの行が返されます。When VERSION is specified, one row that has the following columns is returned.

列名Column name データ型Data type 説明Description
SYS_CHANGE_VERSIONSYS_CHANGE_VERSION bigintbigint 現在の行に関連付けられている変更バージョンの値です。Current change version value that is associated with the row.

変更の追跡の保有期間より長い期間にわたって変更が行われていない場合、または変更の追跡が有効になってから行が変更されていない場合、この値は NULL になります。The value is NULL if a change has not been made for a period longer than the change tracking retention period, or the row has not been changed since change tracking was enabled.
SYS_CHANGE_CONTEXTSYS_CHANGE_CONTEXT varbinary (128)varbinary(128) INSERT、UPDATE、DELETE の各ステートメントの一部として WITH 句を使用することによってオプションで指定できる変更のコンテキスト情報です。Change context information that you can optionally specify by using the WITH clause as part of an INSERT, UPDATE, or DELETE statement.
<primary key column value> ユーザーテーブルの列と同じSame as the user table columns 追跡対象テーブルの主キー値。The primary key values for the tracked table. これらの値は、ユーザーテーブル内の各行を一意に識別します。These values uniquely identify each row in the user table.

解説Remarks

CHANGETABLE 関数は、クエリの FROM 句の中でテーブルとして使用されるのが一般的です。The CHANGETABLE function is typically used in the FROM clause of a query as if it were a table.

CHANGETABLE(CHANGES...)CHANGETABLE(CHANGES...)

新規または変更された行の行データを取得するには、主キー列を使用して、結果セットをユーザーテーブルに結合します。To obtain row data for new or modified rows, join the result set to the user table by using the primary key columns. Last_sync_version値以降に同じ行に複数の変更が加えられた場合でも、変更されたユーザーテーブルの各行に対して1行だけが返されます。Only one row is returned for each row in the user table that has been changed, even if there have been multiple changes to the same row since the last_sync_version value.

主キー列の変更は更新としてマークされません。Primary key column changes are never marked as updates. 主キーの値が変更された場合は、古い値の削除と新しい値の挿入と見なされます。If a primary key value changes, it is considered to be a delete of the old value and an insert of the new value.

行を削除した後、古い主キーを持つ行を挿入すると、その変更は行のすべての列に対する更新として表示されます。If you delete a row and then insert a row that has the old primary key, the change is seen as an update to all columns in the row.

SYS_CHANGE_OPERATION 列と SYS_CHANGE_COLUMNS 列に対して返される値は、指定されたベースライン (last_sync_version) に対して相対的です。The values that are returned for the SYS_CHANGE_OPERATION and SYS_CHANGE_COLUMNS columns are relative to the baseline (last_sync_version) that is specified. たとえば、バージョン10で挿入操作が実行され、バージョン15で更新操作が行われた場合、ベースライン last_sync_version が12の場合、更新が報告されます。For example, if an insert operation was made at version 10 and an update operation at version 15, and if the baseline last_sync_version is 12, an update will be reported. Last_sync_version値が8の場合は、挿入がレポートされます。If the last_sync_version value is 8, an insert will be reported. SYS_CHANGE_COLUMNS では、計算列は更新された列として報告されません。SYS_CHANGE_COLUMNS will never report computed columns as having been updated.

一般に、ユーザー テーブルに対するデータの挿入、更新、または削除の操作は、MERGE ステートメントも含め、すべて追跡されます。Generally, all operations that insert, update, or delete of data in user tables are tracked, including the MERGE statement.

ユーザー テーブルのデータに影響する操作のうち、追跡されない操作は次のとおりです。The following operations that affect user table data are not tracked:

  • UPDATETEXT ステートメントの実行Executing the UPDATETEXT statement

    このステートメントは将来のバージョンの SQL ServerSQL Server では削除される予定であり、非推奨とされます。This statement is deprecated and will be removed in a future version of SQL ServerSQL Server. ただし、を使用して行われた変更は、です。UPDATE ステートメントの WRITE 句は追跡されます。However, changes that are made by using the .WRITE clause of the UPDATE statement are tracked.

  • TRUNCATE TABLE を使用した行の削除Deleting rows by using TRUNCATE TABLE

    テーブルが切り捨てられると、テーブルに関連付けられている変更追跡バージョン情報はリセットされ、変更の追跡を有効にした直後と同じ状態になります。When a table is truncated, the change tracking version information that is associated with the table is reset as if change tracking has just been enabled on the table. クライアントアプリケーションは、常に最終同期バージョンを検証する必要があります。A client application should always validate its last synchronized version. テーブルが切り捨てられている場合、検証は失敗します。The validation fails if the table has been truncated.

CHANGETABLE(VERSION...)CHANGETABLE(VERSION...)

存在しない主キーが指定されている場合は、空の結果セットが返されます。An empty result set is returned if a nonexistent primary key is specified.

保有期間より長い期間にわたって変更が行われていない場合 (クリーンアップによって変更情報が削除されている場合など) や、テーブルに対して変更の追跡を有効にしてからまだ行が変更されていない場合、SYS_CHANGE_VERSION の値は NULL になります。The value of SYS_CHANGE_VERSION might be NULL if a change has not been made for longer than the retention period (for example, the cleanup has removed the change information) or the row has never been changed since change tracking was enabled for the table.

アクセス許可Permissions

変更追跡情報を取得するには、 テーブル 値によって指定されたテーブルに対する次の権限が必要です。Requires the following permissions on the table that is specified by the table value to obtain change tracking information:

  • 主キー列に対する SELECT 権限SELECT permission on the primary key columns

  • VIEW CHANGE TRACKINGVIEW CHANGE TRACKING

Examples

A.A. データの初期同期のための行を返すReturning rows for an initial synchronization of data

次の例は、テーブル データを初期同期するためにデータを取得する方法を示しています。The following example shows how to obtain data for an initial synchronization of the table data. このクエリは、すべての行データとそれに関連付けられたバージョンを返します。The query returns all row data and their associated versions. その後、同期されたデータを格納するシステムにこのデータを挿入または追加できます。You can then insert or add this data to the system that will contain the synchronized data.

-- 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.B. 特定のバージョン以降に加えられたすべての変更を一覧表示するListing all changes that were made since a specific version

次の例では、指定したバージョン (@last_sync_version) 以降にテーブルで行われたすべての変更を一覧表示します。The following example lists all changes that were made in a table since the specified version (@last_sync_version). [Emp ID] と SSN は、複合主キーの列です。[Emp ID] and SSN are columns in a composite primary key.

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.C. 同期のために変更されたすべてのデータを取得するObtaining all changed data for a synchronization

次の例は、変更されたデータをすべて取得する方法を示しています。The following example shows how you can obtain all data that has changed. このクエリでは、変更追跡情報をユーザー テーブルと結合して、ユーザー テーブルの情報が返されるようにしています。This query joins the change tracking information with the user table so that user table information is returned. は、削除された LEFT OUTER JOIN 行に対して行が返されるように使用されます。A LEFT OUTER JOIN is used so that a row is returned for deleted rows.

-- 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.D. CHANGETABLE (VERSION...) を使用して競合を検出するDetecting conflicts by using CHANGETABLE(VERSION...)

次の例は、行が前回の同期以降に変更されていない場合にのみ、行を更新する方法を示しています。The following example shows how to update a row only if the row has not changed since the last synchronization. CHANGETABLE を使用して、特定の行のバージョン番号を取得しています。The version number of the specific row is obtained by using CHANGETABLE. 行が更新されている場合、変更は行われず、クエリは行に対する最新の変更に関する情報を返します。If the row has been updated, changes are not made and the query returns information about the most recent change to the row.

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

参照See Also

変更追跡関数 (Transact-SQL) Change Tracking Functions (Transact-SQL)
データ変更の追跡 (SQL Server) Track Data Changes (SQL Server)
CHANGE_TRACKING_IS_COLUMN_IN_MASK (Transact-sql) CHANGE_TRACKING_IS_COLUMN_IN_MASK (Transact-SQL)
CHANGE_TRACKING_CURRENT_VERSION (Transact-sql) CHANGE_TRACKING_CURRENT_VERSION (Transact-SQL)
CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL)CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL)