我遇到了在以下情况下通过SQL Server 2008中的更改跟踪检测表截断的问题:
我们假设CHANGE_TRACKING_CURRENT_VERSION = 10,我们正在为table1启用更改跟踪。
我认为正确的行为不仅应该将MIN_VALID_VERSION设置为CURRENT_VERSION,还应该在此操作之前增加CURRENT_VERSION。但SQL Server不会增加CURRENT_VERSION - 因此我的问题 - 如何检测表截断?
答案 0 :(得分:1)
如评论中所述,Microsoft SQL Server中的CHANGE TRACKING不会检测到TRUNCATE TABLE。 From the docs:
可以对已更改的表执行截断表 跟踪启用。但是,操作删除的行 未跟踪,并更新最低有效版本。当一个 应用程序检查其版本,检查表明该版本 太旧了,需要重新初始化。这是一样的 更改跟踪被禁用,然后重新启用该表。
你也无法发现TRUNCATE by a trigger:
TRUNCATE TABLE无法激活触发器,因为操作有效 不记录单个行删除
正如评论中所提到的,使用DELETE代替将跟踪更改,在应用程序代码中,您应该使用DELETE而不是TRUNCATE。 (TRUNCATE TABLE还有其他副作用,例如重置IDENTITY列。)