cdc.fn_cdc_get_net_changes_<capture_instance> (Transact-SQL)
指定された LSN 範囲内で、変更されている各ソース行につき 1 件の差分変更行を返します。つまり、LSN 範囲内でソース行に複数の変更が存在していたとしても、その行の最終的な内容を反映した単一の行が返されます。たとえば、あるトランザクションによってソース テーブルに行が挿入された後、LSN 範囲内の別のトランザクションによって、同じ行の 1 つまたは複数の列が更新された場合、この関数から返されるのは、更新後の列値を含んだ 1 行になります。
この列挙関数は、ソース テーブルに対して変更データ キャプチャを有効にし、かつ、差分追跡を指定した場合に作成されます。差分追跡を有効にするには、ソース テーブルに主キーまたは一意のインデックスが必要です。関数名は、cdc.fn_cdc_get_net_changes_capture_instance の形式で付けられます。capture_instance は、ソース テーブルの変更データ キャプチャを有効にしたときに、キャプチャ インスタンスに対して指定された値です。詳細については、「sys.sp_cdc_enable_table (Transact-SQL)」を参照してください。
構文
cdc.fn_cdc_get_net_changes_capture_instance ( from_lsn , to_lsn , '<row_filter_option>' )
<row_filter_option> ::=
{ all
| all with mask
| all with merge
}
引数
from_lsn
結果セットに含める LSN 範囲の下端を表す LSN を指定します。from_lsn のデータ型は binary(10) です。結果セットには、cdc.[capture_instance]_CT 変更テーブル内の行のうち、__$start_lsn の値が from_lsn 以上である行だけが格納されます。
to_lsn
結果セットに含める LSN 範囲の上端を表す LSN を指定します。to_lsn のデータ型は binary(10) です。結果セットには、cdc.[capture_instance]_CT 変更テーブル内の行のうち、__$start_lsn の値が from_lsn 以下または to_lsn と等しい行だけが格納されます。
<row_filter_option> ::= { all | all with mask | all with merge }
結果セットとして返される行およびメタデータ列の内容を制御するオプションです。次のいずれかのオプションを指定できます。all
行に対する最終的な変更の LSN と、その行に適用する操作が、メタデータ列 __$start_lsn および $operation に返されます。$update_mask 列は常に NULL です。all with mask
行に対する最終的な変更の LSN と、その行に適用する操作が、メタデータ列 $start_lsn および $operation に返されます。また、更新操作から制御が返ると ($operation = 4)、この操作で変更されたキャプチャ対象列が、$update_mask の戻り値としてマークされます。all with merge
行に対する最終的な変更の LSN が、メタデータ列 $start_lsn に返されます。$operation 列は、2 つの値のいずれかになります。削除操作の場合は 1、変更を適用するために必要な操作が挿入または更新であった場合は 5 になります。__$update_mask 列は常に NULL です。特定の変更に必要な操作を厳密に特定するロジックではクエリが複雑になってしまいます。そのため、このオプションでは、変更データの適用に必要な操作が、挿入と更新のいずれかであることがわかればよく、両者を明確に区別する必要がない場合に、より高いパフォーマンスでクエリを実行できるように設計されています。このオプションは、SQL Server 2008 環境など、マージ操作を直接利用できるターゲット環境で使用すると効果的です。
返されるテーブル
列名 |
データ型 |
説明 |
---|---|---|
__$start_lsn |
binary(10) |
変更のコミット トランザクションに関連付けられた LSN。 同じトランザクションでコミットされたすべての変更は、同じコミット LSN を共有します。たとえば、ソース テーブルの更新操作によって、2 つの列が 2 行にわたって変更された場合、変更テーブルには、すべて同じ __$start_lsn 値を持った 4 つの行が格納されます。 |
__$seqval |
binary(10) |
特定のトランザクションに含まれる行の変更を並べ替えるためのシーケンス値。 |
__$operation |
int |
変更データの行をターゲット データ ソースに適用するために必要となった DML (データ操作言語) 操作を識別します。 row_filter_option パラメーターの値が all または all with mask である場合、この列の値には、次のいずれかの値を指定できます。 1 = 削除 2 = 挿入 4 = 更新 row_filter_option パラメーターの値が all with merge である場合、この列の値には、次のいずれかの値を指定できます。 1 = 削除 5 = 挿入または更新 5 の値は、行が既に存在しているので更新のみが必要であるのか、行が現在存在していないために挿入が必要であるのか、わからないことを示します。 |
__$update_mask |
varbinary(128) |
キャプチャ インスタンスに対して指定された各キャプチャ対象列に対応するビットを持ったビット マスク。__$operation が 1 または 2 の場合、定義されているすべてのビットが 1 に設定されます。__$operation が 3 または 4 の場合、変更された列に対応するビットだけが 1 に設定されます。 |
<キャプチャされたソース テーブル列> |
各種 |
この関数によって返されるその他の列は、ソース テーブルの列のうち、キャプチャ インスタンスの作成時にキャプチャ対象として指定された列です。キャプチャ対象列リストで列が指定されなかった場合、ソース テーブルのすべての列が返されます。 |
権限
固定サーバー ロール sysadmin または固定データベース ロール db_owner のメンバーシップが必要です。それ以外のすべてのユーザーについては、ソース テーブルのすべてのキャプチャ対象列に対する SELECT 権限が必要です。さらに、キャプチャ インスタンスのゲーティング ロールが定義されている場合は、そのデータベース ロールのメンバーシップが必要です。呼び出し元にソース データを表示する権限がなかった場合、エラー 208 (無効なオブジェクト名) が返されます。
説明
指定した LSN 範囲が、キャプチャ インスタンスの変更追跡時間外に該当した場合、エラー 208 (無効なオブジェクト名) が返されます。
例
次の例では、特定の時間内にソース テーブル HumanResources.Department に対して行われた差分変更を、cdc.fn_cdc_get_net_changes_HR_Department 関数を使ってレポートします。
まず、GETDATE 関数を使用して期間の始まりを指定します。ソース テーブルに対して複数の DML ステートメントを適用した後、再び GETDATE 関数を呼び出して期間の終わりを指定します。次に、sys.fn_cdc_map_time_to_lsn 関数を使用して、その期間を変更データ キャプチャのクエリ範囲 (上限と下限は LSN 値で指定) にマップします。最後に、cdc.fn_cdc_get_net_changes_HR_Department 関数を呼び出して、該当期間中に行われたソース テーブルへの差分変更を取得します。挿入後に削除された行については、関数から返される結果セットに含まれません。たとえ行を追加しても、同じ期間内に削除されれば、その期間におけるソース テーブルへの差分変更とはならないためです。この例を実行する前に、「sys.sp_cdc_enable_table (Transact-SQL)」の例 B を実行してください。
USE AdventureWorks2008R2;
GO
DECLARE @begin_time datetime, @end_time datetime, @from_lsn binary(10), @to_lsn binary(10);
-- Obtain the beginning of the time interval.
SET @begin_time = GETDATE() -1;
-- DML statements to produce changes in the HumanResources.Department table.
INSERT INTO HumanResources.Department (Name, GroupName)
VALUES (N'MyDept', N'MyNewGroup');
UPDATE HumanResources.Department
SET GroupName = N'Resource Control'
WHERE GroupName = N'Inventory Management';
DELETE FROM HumanResources.Department
WHERE Name = N'MyDept';
-- Obtain the end of the time interval.
SET @end_time = GETDATE();
-- Map the time interval to a change data capture query range.
SET @from_lsn = sys.fn_cdc_map_time_to_lsn('smallest greater than or equal', @begin_time);
SET @to_lsn = sys.fn_cdc_map_time_to_lsn('largest less than or equal', @end_time);
-- Return the net changes occurring within the query window.
SELECT * FROM cdc.fn_cdc_get_net_changes_HR_Department(@from_lsn, @to_lsn, 'all');