cdc.fn_cdc_get_net_changes_<capture_instance> (Transact-SQL)
適用対象: SQL Server
指定したログ シーケンス番号 (LSN) 範囲内で変更されたソース行ごとに、1 つの純変更行を返します。
待って、LSN とは SQL Server トランザクション ログ内のすべてのレコードは、ログ シーケンス番号 (LSN) によって一意に識別されます。 LSN2 が LSN1 より大きい場合、LSN2 によって参照されるログ レコードによって記述された変更が発生 後 ログ レコード LSN によって記述された変更になるように順序付けられます。
重大なイベントが発生したログ レコードの LSN は、正しい復元シーケンスを構築するのに役立ちます。 LSN は順序付けされているため、等値と等しくないかどうかを比較できます (つまり、 <、 >、=、 <=、 >=)。 このような比較は、復元シーケンスを構築するときに役立ちます。
LSN 範囲でソース行に複数の変更がある場合、その行の最終的な内容を反映する 1 つの行が、以下で説明する列挙関数によって返されます。 たとえば、トランザクションがソース テーブルに行を挿入し、LSN 範囲内の後続のトランザクションがその行の 1 つ以上の列を更新した場合、関数は更新された列値を含む 1 行行 のみを返します。
この列挙関数は、ソース テーブルで変更データ キャプチャが有効になっており、ネット追跡が指定されている場合に作成されます。 net 追跡を有効にするには、ソース テーブルに主キーまたは一意のインデックスが必要です。 関数名は派生し、 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 }
メタデータ列の内容と、結果セットで返される行を管理するオプション。 次のいずれかのオプションを指定できます。
すべて
行に対する最終変更の LSN と、メタデータ列 __$start_lsn および __$操作の行を適用するために必要な操作を返します。 列 __$update_maskは常に NULL です。
すべてマスク付き
行に対する最終変更の LSN と、メタデータ列 __$start_lsn および __$操作の行を適用するために必要な操作を返します。 さらに、更新操作から (__$operation = 4) が返されると、更新で変更されたキャプチャされた列は、__$update_mask で返される値にマークされます。
すべてマージあり
行に対する最終的な変更の LSN が、メタデータ列 __$start_lsn に返されます。 列 __$操作は、削除の場合は 1、変更を適用するために必要な操作が挿入または更新であることを示す 5 の 2 つの値のいずれかになります。 列 __$update_maskは常に NULL です。
特定の変更に対して正確な操作を決定するロジックはクエリの複雑さを増すので、このオプションは、変更データを適用するために必要な操作が挿入または更新のいずれかであることを示すのに十分な場合にクエリのパフォーマンスを向上させるために設計されていますが、2 つを明示的に区別する必要はありません。 このオプションは、マージ操作を直接使用できるターゲット環境で最も魅力的です。
返されるテーブル
列名 | データ型 | 説明 |
---|---|---|
__$start_lsn | binary(10) | 変更のコミット トランザクションに関連付けられた LSN。 同じトランザクションでコミットされたすべての変更は、同じコミット LSN を共有します。 たとえば、ソース テーブルの更新操作で 2 つの行の 2 つの列が変更された場合、変更テーブルには 4 つの行が含まれます。各行は同じ __$start_lsnvalue。 |
__$operation | int | 変更データの行をターゲット データ ソースに適用するために必要なデータ操作言語 (DML) 操作を識別します。 row_filter_option パラメーターの値が all または all with mask である場合、この列の値には、次のいずれかの値を指定できます。 1 = 削除 2 = 挿入 4 = 更新 row_filter_option パラメーターの値が all with merge である場合、この列の値には、次のいずれかの値を指定できます。 1 = 削除 5 = 挿入または更新 |
__$update_mask | varbinary (128) | キャプチャ インスタンスに対して指定された各キャプチャ対象列に対応するビットを持ったビット マスク。 この値には、__$operation = 1 または 2 の場合、定義されているすべてのビットが 1 に設定されます。 __$operation = 3 または 4 の場合、変更された列に対応するビットのみが 1 に設定されます。 |
<キャプチャ対象のソース テーブルの列> | 多様 | この関数によって返されるその他の列は、ソース テーブルの列のうち、キャプチャ インスタンスの作成時にキャプチャ対象として指定された列です。 キャプチャ対象列リストで列が指定されなかった場合、ソース テーブルのすべての列が返されます。 |
アクセス許可
sysadmin 固定サーバー ロールまたは固定データベース ロールdb_ownerメンバーシップが必要です。 他のすべてのユーザーには、ソース テーブル内のキャプチャされたすべての列に対する SELECT アクセス許可と、キャプチャ インスタンスのゲーティング ロールが定義されている場合は、そのデータベース ロールのメンバーシップが必要です。 呼び出し元にソース データを表示する権限がない場合、関数はすべての列に対して NULL 値を持つ行を返します。
解説
行の一意識別子を変更すると、 fn_cdc_get_net_changes
で最初の UPDATE コマンドが DELETE で表示され、代わりに INSERT コマンドが表示されます。 この動作は、変更の前後の両方でキーを追跡するために必要です。
指定された LSN 範囲が、 cdc.fn_cdc_get_all_changes_<capture_instance>
または cdc.fn_cdc_get_net_changes_<capture_instance>
を呼び出すときに適切でない場合は、エラー 313 が予期されます。 lsn_value
パラメーターが最も低い LSN または最大 LSN の時間を超えている場合、これらの関数の実行はエラー 313: Msg 313, Level 16, State 3, Line 1 An insufficient number of arguments were supplied for the procedure or function
で返されます。 このエラーは、開発者が処理する必要があります。
例
次の例では、関数 cdc.fn_cdc_get_net_changes_HR_Department
を使用して、特定の時間間隔中にソース テーブル HumanResources.Department
に加えられた純変更を報告します。
最初に、 GETDATE
関数を使用して、時間間隔の先頭をマークします。 ソース テーブルに対して複数の DML ステートメントを適用した後、再び GETDATE
関数を呼び出して期間の終わりを指定します。 次に、関数 sys.fn_cdc_map_time_to_lsn を使用して、LSN 値で囲まれた変更データ キャプチャ クエリ範囲に時間間隔をマップします。 最後に、cdc.fn_cdc_get_net_changes_HR_Department
関数を呼び出して、該当期間中に行われたソース テーブルへの差分変更を取得します。 挿入されて削除された行が、関数によって返される結果セットに表示されないことに注意してください。 たとえ行を追加しても、同じ期間内に削除されれば、その期間におけるソース テーブルへの差分変更とはならないためです。
Note
この例を実行する前に、テーブル HumanResources.Department
で CDC を有効にするには、最初に sys.sp_cdc_enable_table (Transact-SQL) で例 B を実行する必要があります。 次の例では、HR_Departmentは、 sys.sp_cdc_enable_table
で指定されている CDC キャプチャ インスタンスの名前です。
USE AdventureWorks2022;
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 = DATEADD(day, -1, GETDATE()) ;
-- 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 @from_lsn = ISNULL(sys.fn_cdc_map_time_to_lsn('smallest greater than or equal', @begin_time), [sys].[fn_cdc_get_min_lsn]('HR_Department') );
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');