CDC на сервере sql

я включил функцию CDC в одной из моих баз данных. теперь у меня есть данные таблицы ниже в таблицах cdc

MemberID            LastName      __$operation
1                   David         4   
1                   Dave          4
2                   Jimmy         4
2                   Test          4

Теперь моя проблема в том, что я должен запросить таблицу cdc и получить все строки, которые являются последними для всех членов (самое последнее обновленное значение). например, запрос вернет

MemberID            LastName      __$operation
1                   Dave          4
2                   Test          4

person zeeshan    schedule 06.02.2014    source источник
comment
В этой таблице нет поля, указывающего на последнюю запись, поэтому это невозможно. Если только у вас нет дополнительных полей, о которых вы нам не сообщаете.   -  person Nick.McDermaid    schedule 06.02.2014
comment
Дело в том, что таблицы SQL Server представляют собой наборы без порядка данных по умолчанию. Таким образом, вам придется изменить свою таблицу, чтобы добавить столбец (например, datetime), на основе которого можно определить порядок возрастания/убывания в строках. Затем вы можете использовать функцию ранжирования row_number или коррелированные подзапросы для получения последних записей.   -  person Deepshikha    schedule 06.02.2014
comment
Итак, вам нужно видеть последние значения только для строк, которые изменились, или последние значения для всех строк, независимо от того, изменились они или нет?   -  person steoleary    schedule 06.02.2014


Ответы (5)


В дополнение к столбцу _$operation существуют также столбцы _$start_lsn и __$seq_val. Заказ, сделанный этими двумя, должен привести вас туда.

person Ben Thul    schedule 06.02.2014

Вы можете не только определить по _$операциям для CDC. Если вы хотите сделать это правильно, используйте другие поля столбца, которые:

__$start_lsn
__$end_lsn
__$seqval
__$update_mask
person Maverick    schedule 06.02.2014

Так что я не уверен на 100%, что понимаю, о чем вы просите, но если вам нужны последние значения для всех элементов в таблице, тогда игнорируйте таблицу CDC и просто запрашивайте саму таблицу, поскольку именно здесь находятся все последние значения. после всего.

Если вам нужно увидеть последние значения для всех элементов, которые были изменены в течение определенного периода времени, вам следует использовать функцию cdc.fn_cdc_get_net_changes_(capture_instance), подробно описанную здесь:

cdc.fn_cdc_get_net_changes

Это позволяет вам указать начальную и конечную дату для периода захвата (с помощью функции sys.fn_cdc_map_time_to_lsn, которая позволяет сопоставлять номера LSN с фактическим временем), а затем он выводит чистые изменения в таблицу в течение этого периода.

Изменения cdc.fn_cdc_get_net_changes_(capture_instance) генерируются в зависимости от имени вашей таблицы, поэтому, поскольку вы не указали, что это такое, я назвал его dbo_members, пожалуйста, измените при необходимости, вот пример того, как вы можете получить список последние значения для всех измененных элементов за последний день с использованием описанных выше функций:

DECLARE @begin_time DATETIME ,
    @end_time DATETIME ,
    @begin_lsn BINARY(10) ,
    @end_lsn BINARY(10);
SELECT  @begin_time = GETDATE() - 1 ,
        @end_time = GETDATE(); 
SELECT  @begin_lsn = sys.fn_cdc_map_time_to_lsn('smallest greater than',
                                                @begin_time); 
SELECT  @end_lsn = sys.fn_cdc_map_time_to_lsn('largest less than or equal',
                                              @end_time); 
SELECT  [MemberID] ,
        [LastName]
FROM    cdc.fn_cdc_get_net_changes_dbo_members(@begin_lsn, @end_lsn, 'all') 
GO 
person steoleary    schedule 06.02.2014

В соответствии со steoleary вы можете просто проверить таблицу данных на наличие последних значений и полностью игнорировать CDC, но если вы ищете, что изменилось со значениями от и до, вам нужно будет обратиться к значениям _$operation 3 (удалено) и 4 (вставленных) значения в сочетании с __$start_lsn. Вставленные и удаленные значения соответствуют тем таблицам, которые вы использовали бы при написании триггеров.

Чтобы просто увидеть, какие значения столбцов изменяются в качестве предшественника фактической оценки этих значений, вы можете использовать столбец __$update_mask, связанный с таблицей cdc.captured_columns, которая предоставит вам фактические имена столбцов, реализуя sys.fn_cdc_is_bit_set(captured_columns .column_ordinal, __$update_mask), где результат = 1.

Добро пожаловать в дурацкий мир CDC и обильное количество поздних ночей и доз кофеина, необходимых даже для того, чтобы попытаться освоить его!

person Tony    schedule 08.09.2015

Если имя вашей системной таблицы cdc cdc.dbo_demo_ct, то с помощью следующего запроса вы получите желаемый результат:

SELECT *
FROM   (SELECT Row_number() OVER (partition BY a.MemberID ORDER BY b.tran_end_time DESC) t,
                       *
FROM   cdc.dbo_demo_ct a
  INNER JOIN cdc.lsn_time_mapping b
ON a.__$start_lsn = b.start_lsn) T
WHERE  T.t = 1
person Sanjay Aswani    schedule 26.12.2016