更改跟踪:TRACK_COLUMNS_UPDATED 不起作用?
change tracking: TRACK_COLUMNS_UPDATED not working?
我有一个名为 tdc
的 table:
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_VERSION49对应的update
运算为什么SYS_CHANGE_COLUMNS为NULL?
正如您可以从 SYS_CHANGE_VERSION
中推断的那样,我已经多次创建此 table。提及我在此 table 中也启用了 change data capture
可能会有所帮助。有趣的是,cdc 工作正常。
结果竟然是正确的!
首先,Change Tracking和CDC是没有关系的。 CDC 是一项企业功能,可捕获每一次更改,包括原始数据和修改后的数据。
另一方面,更改跟踪是所有版本中都可用的轻量级功能,自特定更改跟踪版本以来,returns 每行 更改状态 。这就是它使用起来如此便宜的原因。
Per row
在这里很重要,因为它意味着每一行只会返回一条记录,即使它被多次更改并最终被删除。自我们提供的 @last_sync_version
以来所做的所有更改将被汇总并返回一条记录。
想一想,当您请求自时间开始以来的所有更改时,PK 为 0 的行的状态是什么,好吧,跟踪?它是新的,所以它的状态是正确的 I
并且没有更改的列。
如果从该 table 的最低版本开始搜索,您将得到相同的结果。此时,更改跟踪 table 包括 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
我有一个名为 tdc
的 table:
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_VERSION49对应的update
运算为什么SYS_CHANGE_COLUMNS为NULL?
正如您可以从 SYS_CHANGE_VERSION
中推断的那样,我已经多次创建此 table。提及我在此 table 中也启用了 change data capture
可能会有所帮助。有趣的是,cdc 工作正常。
结果竟然是正确的!
首先,Change Tracking和CDC是没有关系的。 CDC 是一项企业功能,可捕获每一次更改,包括原始数据和修改后的数据。
另一方面,更改跟踪是所有版本中都可用的轻量级功能,自特定更改跟踪版本以来,returns 每行 更改状态 。这就是它使用起来如此便宜的原因。
Per row
在这里很重要,因为它意味着每一行只会返回一条记录,即使它被多次更改并最终被删除。自我们提供的 @last_sync_version
以来所做的所有更改将被汇总并返回一条记录。
想一想,当您请求自时间开始以来的所有更改时,PK 为 0 的行的状态是什么,好吧,跟踪?它是新的,所以它的状态是正确的 I
并且没有更改的列。
如果从该 table 的最低版本开始搜索,您将得到相同的结果。此时,更改跟踪 table 包括 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