【问题标题】:Change Tracking Delete vs Insert and Update更改跟踪删除与插入和更新
【发布时间】:2021-06-14 14:31:33
【问题描述】:

我正在开发一个集中记录所有数据操作操作的系统。 当前应用了 SQL Server 更改跟踪,但它跟踪的数据存在问题。 例如。如果我在 TableX 中插入一行,更新同一行然后删除它,似乎只记录了删除操作。有谁知道如何查看以前的操作?

DECLARE 
@synchronization_version bigint,
@last_synchronization_version bigint;;

-- Obtain the current synchronization version. This will be used next time that changes are obtained.  
SET @synchronization_version = CHANGE_TRACKING_CURRENT_VERSION();  
  
-- Obtain initial data set.  
SELECT T.* 
FROM TableX AS T; 

SELECT DTC.commit_time, CT.*, T.* 
FROM TableX AS T 
RIGHT OUTER JOIN CHANGETABLE(CHANGES TableX, @last_synchronization_version) AS CT ON T.fldId = CT.fldId 
JOIN sys.dm_tran_commit_table DTC ON CT.sys_change_version = DTC.commit_ts; 

【问题讨论】:

  • 您确定更改不会太旧以至于它们被自动删除了吗?你确定更改发生在@last_synchronization_version
  • 来自Change Tracking 页面... 如果应用程序需要有关所做的所有更改和更改数据的中间值的信息,请使用change data capture,而不是更改跟踪,可能是合适的。
  • @Charlieface 我通过插入数据和运行查询对其进行了测试。然后它返回插入的行。更新同一行后,查询返回仍然是插入操作的同一行。接下来我删除该行,查询只返回被删除的行。跟同步版本有关系吗?
  • From the docs: "用户表中已更改的每一行仅返回一行,即使自 last_sync_version 值以来对同一行进行了多次更改。"所以看起来@AlwaysLearning 是正确的,这对于更改跟踪是不可能的。可能你可以自己查询syscommittab并获取数据,我相信每一个变化都应该在那里

标签: sql-server tsql azure-sql-database


【解决方案1】:

正如@AlwaysLearning 所指出的,解决方案是使用变更数据捕获 (CDC) (Microsoft Docs) 而不是变更跟踪 (CT)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-11
    • 2015-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    相关资源
    最近更新 更多