変更の追跡について (SQL Server)About Change Tracking (SQL Server)

適用対象: ○SQL Server ○Azure SQL Database XAzure SQL Data Warehouse XParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

変更の追跡は、アプリケーションの効率的な変更追跡メカニズムを提供する簡易ソリューションです。Change tracking is a lightweight solution that provides an efficient change tracking mechanism for applications. 一般に、データベース内のデータに対する変更のクエリをアプリケーションで実行し、その変更に関連する情報にアクセスできるようにするには、アプリケーション開発者がカスタムの変更追跡メカニズムを実装する必要がありました。Typically, to enable applications to query for changes to data in a database and access information that is related to the changes, application developers had to implement custom change tracking mechanisms. 通常、このようなメカニズムを作成するには非常に手間がかかり、多くの場合、トリガー、 timestamp 列、追跡情報を格納する新しいテーブル、およびカスタム クリーンアップ プロセスを組み合わせて使用する必要があります。Creating these mechanisms usually involved a lot of work and frequently involved using a combination of triggers, timestamp columns, new tables to store tracking information, and custom cleanup processes.

変更に必要な情報量はアプリケーションの種類ごとに異なります。Different types of applications have different requirements for how much information they need about the changes. アプリケーションでは、変更の追跡を使用して、ユーザー テーブルに加えられた変更に関する次の情報を取得することができます。Applications can use change tracking to answer the following questions about the changes that have been made to a user table:

  • ユーザー テーブルのどの行が変更されたかWhat rows have changed for a user table?

    • 行が変更されたという情報のみが必要で、行が変更された回数やその間に行われた変更の値は不要です。Only the fact that a row has changed is required, not how many times the row has changed or the values of any intermediate changes.

    • 最新のデータは、追跡されているテーブルから直接取得できます。The latest data can be obtained directly from the table that is being tracked.

  • 行が変更されたかHas a row changed?

    • 同じトランザクションで変更が行われたときに、行が変更されたという情報とその変更に関する情報を取得でき、それらの情報が記録される必要があります。The fact that a row has changed and information about the change must be available and recorded at the time that the change was made in the same transaction.

注意

行われたすべての変更に関する情報や、変更されたデータの中間値についての情報が必要な場合は、変更の追跡ではなく変更データ キャプチャを使用できます。If an application requires information about all the changes that were made and the intermediate values of the changed data, using change data capture, instead of change tracking, might be appropriate. 詳細については、「変更データ キャプチャについて (SQL Server)」を参照してください。For more information, see About Change Data Capture (SQL Server).

一方向および双方向の同期アプリケーションOne-Way and Two-Way Synchronization Applications

SQL Server データベース エンジンSQL Server Database Engine のインスタンスとデータを同期する必要があるアプリケーションでは、変更に対するクエリを実行できる必要があります。Applications that have to synchronize data with an instance of the SQL Server データベース エンジンSQL Server Database Engine must be able to query for changes. 変更の追跡は、一方向および双方向の両方の同期アプリケーションの基礎として使用できます。Change tracking can be used as a foundation for both one-way and two-way synchronization applications.

一方向の同期アプリケーションOne-Way Synchronization Applications

変更の追跡を使用するクライアントや中間層キャッシュ アプリケーションなどの一方向の同期アプリケーションを構築できます。One-way synchronization applications, such as a client or mid-tier caching application, can be built that use change tracking. 次の図に示すように、キャッシュ アプリケーションでは、データが データベース エンジンDatabase Engine に格納され、他のデータ ストアにキャッシュされる必要があります。As shown in the following illustration, a caching application requires data to be stored in the データベース エンジンDatabase Engine and to be cached in other data stores. また、データベース テーブルに加えられた変更を含むように、キャッシュを最新の状態に保つ必要があります。The application must be able to keep the cache up-to-date with any changes that have been made to the database tables. 変更は データベース エンジンDatabase Engineに返されません。There are no changes to pass back to the データベース エンジンDatabase Engine.

一方向の同期アプリケーションを示す図Shows one-way synchronization applications

双方向の同期アプリケーションTwo-Way Synchronization Applications

変更の追跡を使用する双方向の同期アプリケーションも構築できます。Two-way synchronization applications can also be built that use change tracking. このシナリオでは、 データベース エンジンDatabase Engine のインスタンスのデータが 1 つ以上のデータ ストアと同期されます。In this scenario, the data in an instance of the データベース エンジンDatabase Engine is synchronized with one or more data stores. これらのデータ ストアのデータは更新でき、変更は データベース エンジンDatabase Engineに返され、同期される必要があります。The data in those stores can be updated and the changes must be synchronized back to the データベース エンジンDatabase Engine.

双方向の同期アプリケーションを示す図Shows two-way synchronization applications

双方向の同期アプリケーションの好例として、常時接続でないアプリケーションが挙げられます。A good example of two-way synchronization application is an occasionally connected application. この種のアプリケーションでは、クライアント アプリケーションによってローカル ストアに対するクエリおよび更新が行われます。In this type of application, a client application queries and updates a local store. クライアントとサーバーの間で接続が確立されると、アプリケーションとサーバーが同期され、変更されたデータが双方向に送信されます。When a connection is available between a client and server, the application will synchronize with a server, and changed data flows in both directions.

双方向の同期アプリケーションでは、競合を検出できる必要があります。The two-way synchronization applications must be able to detect conflicts. 同期から同期の間に、両方のデータ ストアで同じデータが変更されると、競合が発生します。A conflict would occur if the same data was changed in both data stores in the time between synchronizations. 競合を検出できると、アプリケーションで変更が失われることがなくなります。With the ability to detect conflicts, an application can make sure that changes are not lost.

変更の追跡のしくみHow Change Tracking Works

変更の追跡を構成するには、DDL ステートメントまたは SQL Server Management StudioSQL Server Management Studioを使用します。To configure change tracking, you can use DDL statements or SQL Server Management StudioSQL Server Management Studio. 詳細については、「 変更の追跡の有効化と無効化 (SQL Server)」を参照してください。For more information, see Enable and Disable Change Tracking (SQL Server). 変更を追跡するには、まずデータベースの変更の追跡を有効にして、次にそのデータベース内で追跡するテーブルの変更の追跡を有効にする必要があります。To track changes, change tracking must first be enabled for the database and then enabled for the tables that you want to track within that database. テーブルの定義を変更する必要はなく、トリガーは作成されません。The table definition does not have to be changed in any way, and no triggers are created.

テーブルの変更の追跡を構成すると、そのテーブルの行に影響する DML ステートメントが実行されるたびに、変更された各行の変更追跡情報が記録されます。After change tracking is configured for a table, any DML statement that affects rows in the table will cause change tracking information for each modified row to be recorded. 変更された行のクエリや、変更に関する情報の取得を行うには、 変更追跡関数を使用します。To query for the rows that have changed and to obtain information about the changes, you can use change tracking functions.

変更情報と共に記録される追跡対象テーブルの情報は、主キー列の値だけです。The values of the primary key column is only information from the tracked table that is recorded with the change information. これらの値により、変更された行が識別されます。These values identify the rows that have been changed. それらの行の最新のデータを取得するには、アプリケーションでこの主キー列の値を使用して、ソース テーブルを追跡対象テーブルに結合します。To obtain the latest data for those rows, an application can use the primary key column values to join the source table with the tracked table.

変更の追跡を使用して、各行に加えられた変更に関する情報を取得することもできます。Information about the change that was made to each row can also be obtained by using change tracking. たとえば、変更を行った DML 操作の種類 (挿入、更新、または削除) や、更新操作の一環として変更された列などの情報を取得できます。For example, the type of DML operation that caused the change (insert, update, or delete) or the columns that were changed as part of an update operation.

変更の追跡のクリーンアップChange Tracking Cleanup

(変更追跡で有効な) 全てのテーブルの変更追跡情報は、メモリ内行ストアに格納されます。Change tracking information for all tables (enabled for Change Tracking) is stored in an in-memory rowstore. 変更追跡で有効な各テーブルに関連付けられている変更追跡データは、すべてのチェックポイントでメモリ内行ストアから対応するディスク上の内部テーブルにフラッシュされます。Change tracking data associated with each table enabled for Change Tracking is flushed on every checkpoint from the in-memory rowstore to the corresponding on-disk internal table. また、メモリ内行ストアは、チェックポイント中に行がディスク上のテーブルに移動されてから消去されます。During checkpoint, the in-memory rowstore is also purged after the rows are moved to the on-disk tables.

変更追跡で有効な各テーブルにはディスク上の内部テーブルがあり、変更追跡機能ではこのテーブルを使用して、変更バージョンと特定のバージョン以降に変更された行が判別されます。Each table that is enabled for Change Tracking has an internal on-disk table which is used by Change Tracking functions to determine the change version and the rows that have changed since a particular version. 自動クリーンアップ スレッドがウェイクアップされるたびに、SQL Server インスタンスのすべてのユーザー データベースがスキャンされ、変更追跡が有効なデータベースが識別されます。Every time the auto cleanup thread wakes up, it scans all the user databases on the SQL Server instance to identify the change tracking enabled databases. データベースの保有期間の設定に基づき、各ディスク上の内部テーブルから有効期限切れのレコードが削除されます。Based on the retention period setting of the database, each internal on-disk table is purged of its expired records.

ストアド プロシージャは、内部変更追跡テーブルの手動クリーンアップを実行するために SQL Server 2014 (12.x)SQL Server 2014 (12.x) および SQL Server 2016 (13.x)SQL Server 2016 (13.x) 用 Service Pack に追加されました。A stored procedure was added in Service Packs for SQL Server 2014 (12.x)SQL Server 2014 (12.x) and SQL Server 2016 (13.x)SQL Server 2016 (13.x) for performing manual cleanup for the internal Change Tracking internal tables. ストアド プロシージャの詳細については、KB173157 を参照してください。More information about the stored procedure is available in KB173157.

参照See Also

変更の追跡の有効化と無効化 (SQL Server) Enable and Disable Change Tracking (SQL Server)
変更の追跡のしくみ (SQL Server) Work with Change Tracking (SQL Server)
変更の追跡の管理 (SQL Server) Manage Change Tracking (SQL Server)
データ変更の追跡 (SQL Server)Track Data Changes (SQL Server)