gpt4 book ai didi

sql-server - 尝试了解一些 SQL Server 更改跟踪功能

转载 作者:行者123 更新时间:2023-12-02 08:05:17 24 4
gpt4 key购买 nike

我正在使用具有更改跟踪功能的 SQL Server 2016 SP1,我有一个问题要问您。

我有一个启用了更改跟踪的数据库。该数据库包含一个表 Table已激活“更改跟踪”,但未激活“跟踪列更新”选项。

例如,在 Table ,我只有一栏叫Id类型是“唯一标识符”,这是我的PK。

开始时,我跟踪当前版本的更改为 0。

我得到了它:

SELECT CHANGE_TRACKING_CURRENT_VERSION();

我向 Table 添加了一个新行:
INSERT INTO dbo.[Table] (Id) 
VALUES ('C99F9E2A-1974-47CE-A406-481076F53BBD');

现在,我的更改跟踪当前版本现在是 1。

通过此请求,我可以在更改跟踪系统中看到我的元素:
SELECT * 
FROM CHANGETABLE (CHANGES dbo.[Table], 0) CT;

结果是:

result 1

现在,我用这个删除我的行:
DELETE FROM dbo.[Table] 
WHERE Id = 'C99F9E2A-1974-47CE-A406-481076F53BBD';

更改跟踪当前版本现在是 2。

我用与之前相同的请求再次插入它。

更改跟踪当前版本现在是 3。

有了这个请求,我得到了这个结果:
SELECT * 
FROM CHANGETABLE (CHANGES dbo.[Table], 1) CT;

enter image description here

现在是我的问题,为什么我在 SYS_CHANGE_OPERATION 中得到“U”?

为什么不“我”导致 1 < SYS_CHANGE_CREATION_VERSION 是 3 ?

谢谢你的帮助 !

最佳答案

添加一些动机,更改跟踪功能的目的是使您能够查看自上次检查以来发生的更改,并使您能够收集这些更改并将其应用到某些其他表或外部系统。

如果您查看删除后的更改,您将看到操作为 I .但是,如果您查看自删除之前以来的更改,则会“跳过”删除。但是更改跟踪不记得删除之前的非键值是什么。因此该行被报告为已更新。

例如

ALTER DATABASE current  
SET CHANGE_TRACKING = ON
(CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON)
go
drop table if exists ct

create table ct(id uniqueidentifier primary key)

ALTER TABLE ct
ENABLE CHANGE_TRACKING
WITH (TRACK_COLUMNS_UPDATED = ON)

declare @beforeInsert bigint = (SELECT CHANGE_TRACKING_CURRENT_VERSION());
INSERT INTO dbo.ct (Id) VALUES ('C99F9E2A-1974-47CE-A406-481076F53BBD');
declare @afterInsert bigint = (SELECT CHANGE_TRACKING_CURRENT_VERSION());
DELETE FROM dbo.ct WHERE Id = 'C99F9E2A-1974-47CE-A406-481076F53BBD';
declare @afterDelete bigint = (SELECT CHANGE_TRACKING_CURRENT_VERSION());
INSERT INTO dbo.ct (Id) VALUES ('C99F9E2A-1974-47CE-A406-481076F53BBD');


SELECT 'from before insert to current',id, sys_change_operation FROM CHANGETABLE (CHANGES dbo.ct, @beforeInsert) CT
union all
SELECT 'from after insert to current',id, sys_change_operation FROM CHANGETABLE (CHANGES dbo.ct, @afterInsert) CT
union all
SELECT 'from after delete to current',id, sys_change_operation FROM CHANGETABLE (CHANGES dbo.ct, @afterDelete) CT

产出
                              id                                   sys_change_operation
----------------------------- ------------------------------------ --------------------
from before insert to current C99F9E2A-1974-47CE-A406-481076F53BBD I
from after insert to current C99F9E2A-1974-47CE-A406-481076F53BBD U
from after delete to current C99F9E2A-1974-47CE-A406-481076F53BBD I

关于sql-server - 尝试了解一些 SQL Server 更改跟踪功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52224577/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com