Как получить добавочные изменения от SQL Server CDC

Как я могу получить добавочные изменения из CDC SQL Server, например:

У меня есть таблица customer в базе данных, и любая вставка, обновление или удаление будут сохранены в таблице customer CDC.

Я хотел бы иметь одну таблицу, которая подсказывала бы мне, какое изменение я должен получить дальше.

Например, каждые 10 минут я буду читать только последние 10 минут изменений и сохранять этот диапазон времени, поэтому в следующий раз я получу последнее время плюс 10 минут. (инкрементное чтение)

У кого-нибудь есть хороший пример с CDC

Спасибо


person Alex    schedule 29.03.2011    source источник


Ответы (1)


Вам нужно где-то сохранить последний обработанный вами номер 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 ;
person Simon Hughes    schedule 29.03.2011