0

我有以下触发器将更改保存到日志表。但是,它会不会捕捉到触发的变化?还是有其他解决方案?

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
4

1 回答 1

1

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

为什么要尝试复制更改跟踪中可用的信息?您不能只使用这些功能和 DMV 来代替您自己的吗?

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

于 2013-05-06T21:39:26.430 回答