最近、仮想 cdc インスタンスを使用するソリューションを作成しました (これにより、単一の実際のキャプチャ インスタンスを使用して、無制限の数の別個の個別のインスタンスが単一のターゲット テーブルに対して動作できます。これは、克服する必要がある問題の 1 つでした。
私の解決策は、永続化されたデータ テーブルを使用して CT テーブルからデータを受け取り、そこからデータを処理することでした。30 秒ごとに実行されるジョブと、インスタンス名と最後の LSN を格納するテーブルを使用してこれをセットアップすることで、同じクライアント データベースまたは別の共通データベースの永続ストレージにデータをハイブすることができます。 (同じ SQL インスタンスのオンまたはオフ)。
これにより、いつでもクリーンアップを指定して、ローカルに保存されるデータの量を減らすことができます。
処理の面では、インスタンスの作成時に作成される cdc 関数を使用する必要があります。[ $update_mask] 列を使用することで、実際の列の変更を特定し、[ $start_lsn]/__$seqval、タイムスタンプ (収集されたLSN から)。
update_mask 列とタイムスタンプを解読するには、次のコードを使用できます。
SELECT
[__$start_lsn] ,
[__$end_lsn] ,
[__$seqval] ,
[__$operation] ,
[__$update_mask] ,
sys.fn_cdc_map_lsn_to_time(__$start_lsn) [RowTimestamp],
reverse(stuff(reverse(
( SELECT CC.column_name + ','
FROM cdc.captured_columns CC
INNER JOIN cdc.change_tables CT ON CC.[object_id] = CT.[object_id]
WHERE capture_instance = 'MyCaptureInstanceName'
AND sys.fn_cdc_is_bit_set(CC.column_ordinal, __$update_mask) = 1
FOR
XML PATH('')
))
,1,1,'')) [ChangedColumns],
SYSDATETIME() [CopyTs]
FROM cdc.MyCaptureInstanceName_CT
WHERE [__$start_lsn] > (SELECT ISNULL(MAX(MaxLSN),0) FROM MyLogTable WHERE CaptureInstance = 'MyCaptureInstanceName')