たとえば、SQLServerCDCから増分変更を取得するにはどうすればよいですか。
データベースにテーブルカスタマーがあり、挿入、更新、または削除はCDCテーブルカスタマーに保存されます。
次にどのような変更を加える必要があるかを示すテーブルを1つ作成したいと思います。
たとえば、10分ごとに、最後の10分の変更のみを読み取り、この時間範囲を保存するので、次回は最後の時間に10分を加えたものを取得します。(増分読み取り)
誰もがCDCの良い例を持っています
ありがとう
たとえば、SQLServerCDCから増分変更を取得するにはどうすればよいですか。
データベースにテーブルカスタマーがあり、挿入、更新、または削除はCDCテーブルカスタマーに保存されます。
次にどのような変更を加える必要があるかを示すテーブルを1つ作成したいと思います。
たとえば、10分ごとに、最後の10分の変更のみを読み取り、この時間範囲を保存するので、次回は最後の時間に10分を加えたものを取得します。(増分読み取り)
誰もがCDCの良い例を持っています
ありがとう
処理した最後の LSN をデータベースのどこかに保存する必要があります。
CREATE TABLE cdc_consumer
(cdc_consumer_id SMALLINT NOT NULL CONSTRAINT PK_cdc_consumer PRIMARY KEY CLUSTERED
, [description] VARCHAR(200) NOT NULL
, capture_instance SYSNAME NOT NULL
, last_start_lsn BINARY(10) NULL
, last_seqval BINARY(10) NULL
, date_last_consumed DATETIME NULL
, CONSTRAINT UQ_cdc_consumer UNIQUE NONCLUSTERED ([description], capture_instance));
CDC レコードのバッチの処理が完了したら、このテーブルを更新します。
始点と終点を取得するには、次を使用します。
CREATE PROCEDURE cdc_consumer_start_batch
@cdcConsumerId SMALLINT
, @startLsn BINARY(10) OUTPUT
, @seqval BINARY(10) OUTPUT
, @endLsn BINARY(10) OUTPUT
AS
BEGIN
DECLARE @lastLsn BINARY(10) ;
DECLARE @captureInstance SYSNAME ;
SELECT @lastLsn = last_start_lsn,
@seqval = last_seqval,
@captureInstance = capture_instance
FROM cdc_consumer
WHERE cdc_consumer_id = @cdcConsumerId ;
IF (@captureInstance IS NULL)
BEGIN
DECLARE @errorText VARCHAR(50) ;
SET @errorText = 'Cannot find a cdc consumer with id: "' + CAST(@cdcConsumerId AS VARCHAR(10)) + '"';
RAISERROR(@errorText,16,1) ;
END
SET @startLsn = sys.fn_cdc_get_min_lsn(@captureInstance) ;
IF (@lastLsn > @startLsn)
SET @startLsn = @lastLsn;
SET @endLsn = sys.fn_cdc_get_max_lsn() ;
IF (@endLsn < @startLsn)
RETURN 1 ;
ELSE
RETURN 0 ;
END ;