我有一个名为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正常工作。
答案 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