在触发器中,changetable没有当前的变化?

时间:2013-05-06 20:24:18

标签: sql-server sql-server-2008

我有以下触发器将更改保存到日志表。但是,它不会捕获触发触发器的更改?还是有另一种解决方案吗?

alter trigger trigger_xxx on table1 after delete, update, insert
as
begin
  declare @lastVersion bigint = coalesce((select max(SYS_CHANGE_VERSION) from [log]), 0)

  insert into [log]
        ([SourceColumnDescriptionPattern], SYS_CHANGE_VERSION, SYS_CHANGE_OPERATION, SYS_CHANGE_COLUMNS, SYS_CHANGE_CONTEXT)
  SELECT [SourceColumnDescriptionPattern], SYS_CHANGE_VERSION, SYS_CHANGE_OPERATION, SYS_CHANGE_COLUMNS, SYS_CHANGE_CONTEXT
  FROM changetable(changes [table1], @lastVersion) as ct
end

1 个答案:

答案 0 :(得分:1)

更改跟踪旨在用于同步目的。例如,您可以使用它来确定是否需要刷新应用程序端缓存。因此,您不希望在提交事务之前显示该信息。当您的触发器在事务中执行时,更改仍然不可见。

您为什么要尝试复制更改跟踪中的可用信息?你不能只使用那些功能和DMV而不是你自己的吗?

假设您有充分的理由,最好的选择可能是使用触发器并将受影响的主键与其他相关信息(如时间戳本身)一起捕获。然而,没有真正好的方法来强制执行该触发器在所有其他之前执行,因此您可能仍然处于相同的情况。您可以尝试使用sp_settriggerorder:http://msdn.microsoft.com/en-us/library/ms186762.aspx在您的情况下可能就够了。