我有一个表,我们打电话是[MYTABLE],用进行INSERT,更新触发器。T-SQL触发器在调用其他代码之前发生变化
该触发器需要执行一个存储过程,该存储过程将根据对[MYTABLE]所做的更改进行一些工作。我无法将存储过程的代码移动到触发器中。
到目前为止,一切都很好...因为触发的更改后执行,存储过程有没有需要访问[插入]或[删除]元表。
然而...扳机需要改变一个附加字段(一个[上次更改] SMALLDATETIME),从而所存储的程序可以在其处理使用该数据。这是而不是因此存储过程可以看到插入/更新的内容......该过程可能会根据触发它的更新中未包含的其他记录执行许多操作。
问题是,如果我的触发器更改[上次更改],即要么做什么都(如果我递归触发器关闭),否则将最终调用存储过程两次 - 一次是因为的原始触发改变,再次因为我的修改[LastModified]。
我怎样才能解决这个如此(一)[上次更改]获取与每一个变化和更新的(b)该存储过程只调用后访问的[上次更改]新值?
我有两个想法,我在想,但他们闻到有趣,所以我宁愿看看是否有更直接的解决方案。
编辑:
好吧,这里是解决方案,我到目前为止,也许这将有助于讨论:
1.使用两个触发器。其中一个“INSTEAD OF”触发器将处理用户对记录的更新并将更改LastModified,但如果更新快速返回从 SP(它可以根据哪些列被修改)可以快速返回。另一个将是一个“AFTER”触发器,它将调用EXEC。此触发器通过INSTEAD OF触发器获取已应用的LastModified列的更新。至少我希望这是如何运作的。
2.将ModifiedDate移动到另一个表中。这样,我可以有一个AFTER INSERT/UPDATE触发器,如果用户启动INSERT/UPDATE,则只有,将审计记录添加到另一个表并调用SP。然后,SP将修改其他记录,这会导致触发器再次触发,但它会很快识别出情况并返回而不做更多工作。
第一个解决方案的缺点是我必须在触发器中保留一个列表列表,因此INSTEAD OF update实际上是做了预期的工作(因为我在列表中添加了一列,ModifiedDate,所以我不能只需插入插入的tbl,我必须指定列)。
最初的INSERT/UPDATE是如何执行的?你必须使用触发器吗?我想问的原因是整个事件过程可以封装在一个存储过程中(根本不需要触发器)。 – 2009-08-26 22:30:12