更改跟踪:TRACK_COLUMNS_UPDATED不起作用?

时间:2019-05-13 13:49:18

标签: sql-server change-tracking

我有一个名为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 |
+--------------------+-----------------------------+----------------------+--------------------+--------------------+----+

为什么update操作对应于SYS_CHANGE_VERSION 49的SYS_CHANGE_COLUMNS为NULL?

您可以从SYS_CHANGE_VERSION得出结论,我已经多次创建了该表。值得一提的是,我还在此表中启用了change data capture。有趣的是,cdc正常工作。

1 个答案:

答案 0 :(得分:1)

结果实际上是正确的!

首先,变更跟踪和CDC无关。 CDC是一项企业功能,可捕获所有更改,包括原始和修改后的数据。

另一方面,

变更跟踪是所有版本中的轻量级功能,由于特定的变更跟踪版本,它会每行返回变更状态 。这就是使它如此便宜的原因。

Per row在这里很重要,因为这意味着即使对记录进行了多次更改并最终删除,每一行也只会返回一条记录。自我们提供的@last_sync_version起所做的所有更改都将汇总,并返回一条记录。

考虑一下,自从时间开始以来,您要求进行所有更改时,PK 0的行的状态是什么?它是新的,因此其状态正确为I,并且没有更改的列。

如果从该表的最低版本开始搜索,您将获得相同的结果。此时,变更跟踪表包括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