在官方文档http://technet.microsoft.com/zh-cn/library/ms181299.aspx中“互操作性”段落中有这么一句:
    触发器继续执行 ROLLBACK 语句之后的所有其余语句。 如果这些语句中的任意语句修改数据,则不回滚这些修改。 执行其余的语句不会激发嵌套触发器。
其中“执行其余的语句不会激发嵌套触发器”,是否意味着在回滚操作后面的语句如果继续执行的话,后面语句触发的触发器就不会执行了。比如后面的语句有针对一个表的update操作,而这张表又有update的触发器,这个时候update会执行成功,但触发器不会执行?

解决方案 »

  1.   


    注意,在你发的连接中,只是说,在触发器中rollback之后,可以继续执行触发器中的rollback之后的语句,如果在你的触发器中,后面还有update语句,而update语句会触发另一个表的触发器,那么这个update操作应该是可以执行的,但不会引起update触发器。因为,这种情况下,也就是在一个触发器中引起另一个触发器,就是所谓的嵌套触发器。
    所以嵌套触发器
      

  2.   

    但是很奇怪,我做了一个实验,发现,即使是嵌套触发器,也能够被触发,和微软文档上说的不一样。从下面的insert时的输出,可以看出,在触发器中rollback之后的语句,是可以执行的,另外,update另一个表的操作也执行成功,并且触发了触发器。--drop table t1
    --drop table t2create table t1(id int)
    create table t2(id int)insert into t2
    values(100)
    gocreate trigger dbo.trigger_t1
    on t1
    for insert
    asrollback;select '这是rollback之后的语句,这里能执行'update t2
    set id = 1;
    gocreate trigger dbo.trigger_t2
    on t2
    for update
    asselect '这是t2的update触发器,这里能执行'go
    --插入数据
    insert into t1
    values(1)
    /*
    这是rollback之后的语句,这里能执行这是t2的update触发器,这里能执行消息 3609,级别 16,状态 1,第 3 行
    事务在触发器中结束。批处理已中止。
    */ --没有记录
    select * from t1
    select * from t2
    /*
    id
    1
    */
      

  3.   

    to yupeigu:
    确实,我使用你的代码测试,确实触发了嵌套触发器。有点让人费解……