通过SQL Server 2008中的更改跟踪检测表截断

时间:2015-01-09 13:52:15

标签: sql-server sql-server-2008

我遇到了在以下情况下通过SQL Server 2008中的更改跟踪检测表截断的问题:

我们假设CHANGE_TRACKING_CURRENT_VERSION = 10,我们正在为table1启用更改跟踪。

  1. CURRENT_VERSION = 10,MIN_VALID_VERSION(table1)= 10
  2. 我们正在添加一条新记录 - 现在我们有:CURRENT_VERSION = 11,MIN_VALID_VERSION(table1)= 10
  3. 我们的客户端应用程序要求更改:从版本10开始我的所有更改,假设MIN_VALID_VERSION(table1)> = 10 - 此处一切正常,我们的应用程序会收到有关插入的通知并记住当前版本,现在是11
  4. 我们正在截断一个表 - 现在我们有:CURRENT_VERSION = 11,MIN_VALID_VERSION(table1)= 11
  5. 我们的应用程序要求自版本11以来的所有更改 - 并且没有,但MIN_VALID_VERSION(table1)不大于我们要求的版本(11)。我们的应用程序错过了整个表截断。
  6. 我认为正确的行为不仅应该将MIN_VALID_VERSION设置为CURRENT_VERSION,还应该在此操作之前增加CURRENT_VERSION。但SQL Server不会增加CURRENT_VERSION - 因此我的问题 - 如何检测表截断?

1 个答案:

答案 0 :(得分:1)

如评论中所述,Microsoft SQL Server中的CHANGE TRACKING不会检测到TRUNCATE TABLE。 From the docs:

  

可以对已更改的表执行截断表   跟踪启用。但是,操作删除的行   未跟踪,并更新最低有效版本。当一个   应用程序检查其版本,检查表明该版本   太旧了,需要重新初始化。这是一样的   更改跟踪被禁用,然后重新启用该表。

你也无法发现TRUNCATE by a trigger

  

TRUNCATE TABLE无法激活触发器,因为操作有效   不记录单个行删除

正如评论中所提到的,使用DELETE代替将跟踪更改,在应用程序代码中,您应该使用DELETE而不是TRUNCATE。 (TRUNCATE TABLE还有其他副作用,例如重置IDENTITY列。)