使用 SQL Server 2016 时态表查询已删除记录的最佳方法是什么?

What is the best way to query deleted records with SQL Server 2016 temporal tables?

我正在查看 SQL Server 2016 时态表,但找不到任何有效的方法来查询现在已删除的所有历史记录。

我不喜欢软删除或移动到 'deleted items table',因为我觉得临时表是多余的。

这可以通过临时表以有效的方式实现吗?

时间 tables 旨在为您提供数据的时间点视图,而不是状态视图 - 它实际上并不理解状态。不会向用户公开任何内容来确定行如何到达时间历史记录 table。

如果您没有临时 pause/stop 在您的时间 table 上进行系统版本控制,那么您只需要找到历史 table 和活动 table 之间的增量。历史记录 table 中所有在活动 table 中没有相应行的剩余行都是已删除的行。

例如,如果您有 tblCustCalls 并且使用 tblCustCallsHistory 暂时启用它,例如 SELECT * FROM tblCustCallsHistory WHERE ID NOT IN (SELECT ID FROM tblCustCalls)。在此示例中,ID 是主键。如果 table 非常大但基本概念没有改变,您可以优化 TSQL。

有一种方法可以通过时间 table 的 ValidTo 列检测到它。

记录的最新 ValidTo 将小于当前日期。

或者换一种方式来看,未删除的记录将有一个 ValidTo 等于'9999-12-31 18:59:59.9900000'。我不太信任这个值,无法通过硬编码来查找它,所以我只查找 ValidTo > 当前日期。

别忘了现在是 UTC。

我在删除之前将用户 ID 的最后更新记录在记录中,这样基本上就成了删除者和删除时间的快照。

您还可以添加一个包含操作的列 [Action]。这在以下过程中解决: - 添加新行:只需添加 [Action] = 'Inserted' 的行 - 更新现有行:只需使用 [action] = 'Updated' 更新行 - 删除一行:首先用[Action] = 'Deleted'更新行并删除行

像这样你可以很容易地找到你的基础table中未改变的行(其中[action] = 'Inserted')和你的历史table中删除的行(其中[action] ] = 'Deleted')

请注意,这将在历史记录中创建 2 行 table!! (1 个更新和 1 个删除语句)