【发布时间】: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