例如,如何从 SQL Server CDC 获得增量更改:
我在数据库上有表客户,任何插入、更新或删除都将保存在 CDC 表客户中。
我希望有一张桌子可以告诉我接下来应该得到什么改变。
例如每 10 分钟我会只读取最后 10 分钟的更改并保存这个时间范围,所以下次我会得到最后一次加上 10 分钟。(增量读取)
任何人都有 CDC 的好榜样
谢谢
例如,如何从 SQL Server CDC 获得增量更改:
我在数据库上有表客户,任何插入、更新或删除都将保存在 CDC 表客户中。
我希望有一张桌子可以告诉我接下来应该得到什么改变。
例如每 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 ;