2009-08-26 62 views
0

我有一个表,我们打电话是[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,我必须指定列)。

+0

最初的INSERT/UPDATE是如何执行的?你必须使用触发器吗?我想问的原因是整个事件过程可以封装在一个存储过程中(根本不需要触发器)。 – 2009-08-26 22:30:12

回答

3

你是否试过IF UPDATE(LastModified)指令?

CREATE TRIGGER XYZ ON MYTABLE 
FOR INSERT, UPDATE 
AS 
BEGIN 
IF UPDATE(LastModified) 
    RETURN 
ELSE 
    BEGIN 
    UPDATE MYTABLE SET LastModified = GETDATE() 
    FROM MYTABLE INNER JOIN INSERTED ON MYTABLE.ID = INSERTED.ID 
    EXEC TheStoreProc 
    END 
END; 
+0

这解决了EXEC在工作流的错误一方被调用的问题,但实际上并没有改变LastModified,它需要通过触发器来更新。 – richardtallent 2009-08-27 06:12:08

+0

修复了脚本,现在更新表,然后执行脚本。触发器将被“触发”两次,但内部执行将立即结束。 – Rodrigo 2009-08-27 07:21:18

+0

罗德里戈 - 谢谢,但如果这样做,EXEC“看到”LastModified会改变吗?它会看到它是有道理的,除非触发器在某种隐含的事务中工作。 – richardtallent 2009-08-27 14:27:23

0

我不确定我了解您所描述的流程。难道是:

  1. 记录更新
  2. 更新触发PROC叫
  3. 触发更新上次更改场
  4. 触发器调用另一个PROC

应该做工精细,只要“另一个proc“不会更新同一个表, 这会再次触发触发器。

如果“另一个PROC” 再次更新表,你可能搬完更新 到触发调用“另一个PROC”之前。

这有帮助吗?

+0

不幸的是,这正是发生的情况。 SP将不会*更新与“原始”触发器相同的记录,但会更新其他记录,这将再次调用触发器。所以,虽然没有递归的机会,但它仍然是一个混乱的小步骤循环。不幸的是,将SP代码移到触发器中并不好(因为SP只影响其他*记录,INSTEAD OF触发器不会减少一步递归),并且会使代码更易于维护(触发几个表格调用相同的SP)。我宁愿使用视图,但这次不要打电话。 – richardtallent 2009-08-27 06:09:47

相关问题