--改触发器执行顺序
sp_settriggerorder 触发器名, first, 'UPDATE'

解决方案 »

  1.   

    联机帮助:
    sp_settriggerorder 企业管理器->服务器->属性->服务器设置->允许激发会激发其它触发器(嵌套触发器)的触发器
    勾上即可以嵌套,否则不会嵌套。
      

  2.   

    可用 sp_settriggerorder 指定表上第一个和最后一个执行的 AFTER 触发器。
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^在表上只能为每个 INSERT、UPDATE 和 DELETE 操作指定一个第一个执行和一个最后一个执行的 AFTER 触发器。如果同一表上还有其它 AFTER 触发器,则这些触发器将以随机顺序执行
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      

  3.   

    递归触发器
    当在 sp_dboption 中启用 recursive triggers 设置时,SQL Server 还允许触发器的递归调用。
    触发器的递归调用的触发时间
    遇到诸如inert,update 等语句时马上触发相应的触发器
      

  4.   

    "如果同一表上还有其它 AFTER 触发器,则这些触发器将以随机顺序执行",这个问题很是麻烦,比如有多个触发器对同一个表中的一些字段行了修改,它们会相互触发,这样的话,在同一类型的触发器中就很难判断被修改过的字段的值是什么了。比如field1它在添加的时候为空,trigger1把它改为1,trigger2根据一些条件把它改为2,...然后还有一个triggerN想根据field1的值做相应的动作,但这个值现在是不是难以判断了呢??不知道各位在遇到这种问题的时候怎么处理??
      

  5.   

    如果同一表上还有其它 AFTER 触发器,则这些触发器将以随机顺序执行所以像你所说的这样的情况下,就很有可能得出的结果不是你想要的结果,如果你有这么多不同的条件来控制field1的值的话,你可以把它写在一个TRIGGER里面,分别写出不同条件下得出不同的值!另:触发器应尽量简洁短小,不到万不得以已最好不要考虑用TRIGGER(我的个人意见)
      

  6.   

    来源帮助文档:
    使用嵌套触发器
    如果一个触发器在执行操作时引发了另一个触发器,而这个触发器又接着引发下一个触发器……这些触发器就是嵌套触发器。触发器可嵌套至 32 层,并且可以控制是否可以通过"嵌套触发器"服务器配置选项进行触发器嵌套。如果允许使用嵌套触发器,且链中的一个触发器开始一个无限循环,则超出嵌套级,而且触发器将终止。可使用嵌套触发器执行一些有用的日常工作,如保存前一触发器所影响行的一个备份。例如,可以在 titleauthor 上创建一个触发器,以保存由 delcascadetrig 触发器所删除的 titleauthor 行的备份。在使用 delcascadetrig 时,从 titles 中删除title_id PS2091 将删除 titleauthor 中相应的一行或多行。要保存数据,可在 titleauthor 上创建 DELETE 触发器,该触发器的作用是将被删除的数据保存到另一个单独创建的名为 del_save 表中。例如:CREATE TRIGGER savedel
       ON titleauthor
    FOR DELETE
    AS
       INSERT del_save
       SELECT * FROM deleted不推荐按依赖于顺序的序列使用嵌套触发器。应使用单独的触发器层叠数据修改。说明  由于触发器在事务中执行,如果在一系列嵌套触发器的任意层中发生错误,则整个事务都将取消,且所有的数据修改都将回滚。在触发器中包含 PRINT 语句,用以确定错误发生的位置。
    递归触发器
    触发器不会以递归方式自行调用,除非设置了 RECURSIVE_TRIGGERS 数据库选项。有两种不同的递归方式: 直接递归 
    即触发器激发并执行一个操作,而该操作又使同一个触发器再次激发。例如,一应用程序更新了表 T3,从而引发触发器 Trig3。Trig3 再次更新表 T3,使触发器 Trig3 再次被引发。间接递归 
    即触发器激发并执行一个操作,而该操作又使另一个表中的某个触发器激发。第二个触发器使原始表得到更新,从而再次引发第一个触发器。例如,一应用程序更新了表 T1,并引发触发器 Trig1。Trig1 更新表 T2,从而使触发器 Trig2 被引发。Trig2 转而更新表 T1,从而使 Trig1 再次被引发。当将 RECURSIVE_TRIGGERS 数据库选项设置为 OFF 时,仅防止直接递归。若要也禁用间接递归,请将 nested triggers 服务器选项设置为 0。