cdc.<capture_instance>_CT (Transact-SQL)

ソース テーブルに対して Change Data Capture を有効にすると作成される変更テーブルです。ソース テーブルに対して実行された操作が挿入や削除の場合は、各操作について 1 行を返します。ソース テーブルに対して実行された操作が更新の場合は、各操作について 2 行を返します。ソース テーブルで変更データ キャプチャを有効にしたときに変更テーブルの名前を指定しなかった場合は、名前が自動的に生成されます。生成される名前の形式は、cdc.capture_instance_CT です。capture_instance は、ソース テーブルのスキーマ名とソース テーブル名を表します (schema_table 形式)。たとえば、AdventureWorks2008R2 サンプル データベースの Person.Address テーブルに対して Change Data Capture を有効にした場合、生成される変更テーブル名は cdc.Person_Address_CT になります。

システム テーブルに対して直接クエリを実行することは、できるだけ避けてください。代わりに、cdc.fn_cdc_get_all_changes_<capture_instance> 関数および cdc.fn_cdc_get_net_changes_<capture_instance> 関数を実行します。

列名

データ型

説明

__$start_lsn

binary(10)

変更のコミット トランザクションに関連付けられたログ シーケンス番号 (LSN)。

同じトランザクションでコミットされたすべての変更は、同じコミット LSN を共有します。たとえば、ソース テーブルに対する削除操作によって、2 つの行が削除された場合、変更テーブルには、すべて同じ __$start_lsn 値を持った 2 つの行が格納されます。

__$end_lsn

binary(10)

単に情報を示すためだけに特定されます。サポートされていません。将来の互換性は保証されません。

SQL Server 2008 では、この列は常に NULL です。

__$seqval

binary(10)

特定のトランザクションに含まれる行の変更を並べ替えるためのシーケンス値。

__$operation

int

変更に関連付けられているデータ操作言語 (DML) 操作を識別します。次のいずれかです。

1 = 削除

2 = 挿入

3 = 更新 (古い値)

列データには、更新ステートメントを実行する前の行の値が割り当てられます。

4 = 更新 (新しい値)

列データには、更新ステートメントを実行した後の行の値が割り当てられます。

__$update_mask

varbinary(128)

変更された列を識別する、変更テーブルの列序数に基づくビット マスク。

<キャプチャされたソース テーブル列>

各種

変更テーブル内のその他の列は、ソース テーブルの列のうち、キャプチャ インスタンスの作成時にキャプチャ対象として指定された列です。キャプチャ対象列リストで列が指定されなかった場合、ソース テーブルのすべての列がこのテーブルに格納されます。

説明

キャプチャ対象列のデータ型

このテーブルに含まれるキャプチャ対象列は、ソースの対応する列と同じデータ型および値を持ちます。ただし、次の例外があります。

  • Timestamp 列は binary(8) として定義されます。

  • Identity 列は int または bigint として定義されます。

ただし、これらの列の値は、ソース列の値と同じです。

ラージ オブジェクト データ型

LOB データ型 (varchar(max)、nvarchar(max)、varbinary(max)、image、text、ntext、および xml) については、更新中、列が実際に変更された場合にのみ、古い値が update old 行に格納されます。それ以外のデータ型については、列の値は常に両方の update 行に格納されます。

既定では、INSERT、UPDATE、WRITETEXT、または UPDATETEXT の 1 回のステートメントでキャプチャ対象列に追加できる最大サイズは、65,536 バイト (64 KB) です。このサイズを増やし、より大きな LOB データを追加できるようにするには、max text repl size オプションを使用して、より大きな最大サイズを指定します。詳細については、「max text repl size オプションを構成する方法 (SQL Server Management Studio)」を参照してください。

データ定義言語の修正

列の追加や削除など、ソース テーブルに対する DDL 修正は、cdc.ddl_history テーブルに記録されます。これらの変更は変更テーブルに適用されません。つまり、変更テーブルの定義は以前のままとなります。ソース テーブルには、キャプチャ対象列リストが関連付けられていますが、キャプチャ プロセスで変更テーブルに行を挿入する際、そのリストに存在しない列は無視されます。キャプチャ対象列リストに指定されていた列が、ソース テーブルから既に削除されていた場合、その列には NULL 値が割り当てられます。

ソース テーブル内の列のデータ型を変更した場合も、cdc.ddl_history テーブルに記録されます。ただし、この変更によって、変更テーブルの定義が修正されることはありません。ソース テーブルに対する DDL 変更のログ レコードがキャプチャ プロセスで見つかった場合は、変更テーブルにおけるキャプチャ対象列のデータ型が変更されます。

ソース テーブルにおけるキャプチャ対象列のデータ型を、より小さなデータ型に変更する必要がある場合は、次の手順に従って、変更テーブル内の対応する列が正しく変更されるように配慮してください。

  1. ソース テーブルで、変更する列の値を、変更後のデータ型に収まるように更新します。たとえば、int 型から smallint 型に変更する場合は、smallint 型の範囲内 (-32,768 ~ 32,767) に収まるように値を更新します。

  2. 変更テーブル側の対応する列にも、同じ更新操作を実行します。

  3. ソース テーブル側で新しいデータ型を指定します。データ型の変更が正しく変更テーブルに反映されます。

データ操作言語の変更

Change Data Capture が有効になっているソース テーブルに対して挿入、更新、削除の各操作を実行すると、それらの DML 操作のレコードがデータベース トランザクション ログに表示されます。Change Data Capture のキャプチャ プロセスでは、トランザクション ログからそれらの変更に関する情報を取得し、1 行または 2 行のいずれかを変更テーブルに追加して変更を記録します。エントリは、ソース テーブルでコミットされたときと同じ順序で変更テーブルに追加されますが、変更テーブルのエントリのコミットは通常 1 つのエントリではなく変更のグループに対して実行される必要があります。

変更テーブル エントリ内では、__$start_lsn 列を使用してソース テーブルの変更に関連付けられているコミット LSN を記録し、__$seqval 列を使用してそのトランザクション内での変更順序を示します。これらのメタデータ列を使用して、ソース変更のコミット順を維持することができます。キャプチャ プロセスではトランザクション ログから変更情報を取得するため、変更テーブルのエントリが、対応するソース テーブルの変更と同期して表示されていないか確認することが重要です。代わりに、キャプチャ プロセスがトランザクション ログから関連の変更エントリを処理した後、対応する変更が非同期で表示されます。

挿入操作と削除操作については、更新マスクのすべてのビットが設定されます。更新操作の場合、更新操作中に変更された列を反映するため、update old 行と update new 行の両方の更新マスクが変更されます。