我正在查看 SQL Server 2016 时态表,但找不到任何有效的方法来查询现在已删除的所有历史记录。
我不喜欢软删除或移动到“已删除项目表”,因为我觉得临时表是多余的。
这可以通过临时表以有效的方式实现吗?
我正在查看 SQL Server 2016 时态表,但找不到任何有效的方法来查询现在已删除的所有历史记录。
我不喜欢软删除或移动到“已删除项目表”,因为我觉得临时表是多余的。
这可以通过临时表以有效的方式实现吗?
时态表旨在为您提供数据的时间点视图,而不是状态视图 - 它实际上并不了解状态。没有任何东西暴露给用户来确定一行是如何到达时态历史表中的。
如果您没有暂时暂停/停止临时表上的系统版本控制,那么您只需要找到历史表和活动表之间的增量。在活动表中没有对应行的历史表中的所有剩余行都是已删除的行。
例如,如果您有 tblCustCalls,并且它通过 tblCustCallsHistory 启用了临时功能,例如SELECT * FROM tblCustCallsHistory WHERE ID NOT IN (SELECT ID FROM tblCustCalls)
. 在此示例中,ID 是主键。如果表非常大但基本概念没有改变,您可以优化 TSQL。
有一种方法可以通过时态表的 ValidTo 列来检测它。
记录的最新 ValidTo 将小于当前日期。
或者以另一种方式看待它,未删除的记录将具有等于“9999-12-31 18:59:59.9900000”的 ValidTo。我不相信这个值足以硬编码寻找它,所以我只是寻找 ValidTo > 当前日期。
不要忘记它是UTC。
在删除记录之前,我会在记录上写入用户 id 的最后更新,这样基本上就成了谁删除它以及何时删除它的快照。
您还可以添加包含操作的列 [Action]。这在以下过程中解决: - 添加新行:只需使用 [Action] = 'Inserted' 添加行 - 更新现有行:只需使用 [action] = 'Updated' 更新行 - 删除行:第一次更新[Action] = 'Deleted' 的行并删除该行
像这样,您可以轻松找到基表中未更改的行(其中 [action] = 'Inserted')和历史表中已删除的行(其中 [action] = 'Deleted')
请注意,这将在历史记录表中创建 2 行!!(1 个更新和 1 个删除语句)