отслеживание изменений: TRACK_COLUMNS_UPDATED не работает? - PullRequest
3 голосов
/ 13 мая 2019

У меня есть таблица с именем tdc: create table tdc(pk int primary key,val int)

Я пытаюсь использовать change tracking на нем. Вот сценарий:

drop table tdc
create table tdc(pk int primary key,val int)

ALTER TABLE tdc
ENABLE CHANGE_TRACKING  
WITH (TRACK_COLUMNS_UPDATED = ON) 

insert tdc(pk,val) select 0,432
insert tdc(pk,val) select 1,507
insert tdc(pk,val) select 2,312
insert tdc(pk,val) select 4,432 union all select 5,634
update tdc set val=888 where pk in(0,2)
update tdc set val=777 where pk in(0,2)

declare @from bigint= (select  CHANGE_TRACKING_MIN_VALID_VERSION(object_id('dbo.tdc')))
select * from CHANGETABLE(CHANGES tdc,@from)q

Я получаю:

+====================+=============================+======================+====================+====================+====+
| SYS_CHANGE_VERSION | SYS_CHANGE_CREATION_VERSION | SYS_CHANGE_OPERATION | SYS_CHANGE_COLUMNS | SYS_CHANGE_CONTEXT | pk |
+====================+=============================+======================+====================+====================+====+
|                 49 |                          44 | I                    | NULL               | NULL               |  0 |
+--------------------+-----------------------------+----------------------+--------------------+--------------------+----+
|                 45 |                          45 | I                    | NULL               | NULL               |  1 |
+--------------------+-----------------------------+----------------------+--------------------+--------------------+----+
|                 49 |                          46 | I                    | NULL               | NULL               |  2 |
+--------------------+-----------------------------+----------------------+--------------------+--------------------+----+
|                 47 |                          47 | I                    | NULL               | NULL               |  4 |
+--------------------+-----------------------------+----------------------+--------------------+--------------------+----+
|                 47 |                          47 | I                    | NULL               | NULL               |  5 |
+--------------------+-----------------------------+----------------------+--------------------+--------------------+----+

Почему SYS_CHANGE_COLUMNS NULL для операции update, соответствующей SYS_CHANGE_VERSION 49?

Как вы можете сделать вывод из SYS_CHANGE_VERSION, я создавал эту таблицу несколько раз. Было бы полезно упомянуть, что в этой таблице также включена функция change data capture. Интересно, что CDC работает правильно.

1 Ответ

1 голос
/ 13 мая 2019

Результаты на самом деле верны!

Прежде всего, отслеживание изменений и CDC не связаны. CDC - это корпоративная функция, которая фиксирует каждое изменение, включая оригинальные и измененные данные.

Отслеживание изменений, с другой стороны, - это облегченная функция, доступная во всех редакциях, которая возвращает состояние изменения для строки , начиная с определенной версии отслеживания изменений. Вот что делает его таким дешевым в использовании.

Per row имеет значение здесь, потому что это означает, что только одна запись будет возвращена для каждой строки, даже если она была изменена несколько раз и в конечном итоге удалена. Все изменения, внесенные с момента предоставления @last_sync_version, будут агрегированы, и будет возвращена одна запись.

Подумайте, в каком состоянии находится строка с PK 0, когда вы запрашиваете все изменения с начала времени, ну, отслеживание? Он новый, поэтому его статус справедливо I и столбцы не изменены.

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

Если вы запросите изменения с более новой версии, вы получите запись U:

declare @version bigint=CHANGE_TRACKING_MIN_VALID_VERSION(OBJECT_ID('dbo.tdc'));
declare @next bigint=@version+1
select * from CHANGETABLE(CHANGES tdc,@next)q

SYS_CHANGE_VERSION  SYS_CHANGE_CREATION_VERSION SYS_CHANGE_OPERATION    SYS_CHANGE_COLUMNS  SYS_CHANGE_CONTEXT  pk
20  NULL    U   0x0000000003000000  NULL    0
20  NULL    U   0x0000000003000000  NULL    2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...