CREATE TRIGGER tgg_delete ON dbo.tgg_info
FOR DELETE
ASBEGIN TRANSInsert into .....delete from .....delete from .....COMMIT TRANS==========================================
请问,当第一个Insert Into执行错误时,
1、如果让第二行和第三行的delete不再执行.
2、且让tgg_info的删除操作回滚(就是中止删除并回滚至原来状态)

解决方案 »

  1.   

    在 TRIGGER 里面本来就有隐式事务
    根本不用你写 BEGIN TRANS 它自己在出错的时候就会回滚触发器的原理就是这样的,难道你的触发器不回滚吗?
      

  2.   

    不必加
    如果是存储过程的话这样应该可以
    Insert into .....
       这里加
       if (@@error<>0)
          rollback tran
          print ''
          return
       end
      

  3.   


    二楼三楼说的没错, 但不好意思, 是我没把问题说清楚,描述得太简单了, 我当然知道触发器是有个隐式的事务了, 要不触发器代码中间怎么可以用rollback.问题是我这个触发器是已达到了四层嵌套, 数据逻辑较复杂,
    我开始还以为是这个触发器有问题,所有我就加了个begintrans, committrans
    虽然不出错,但还是有问题, 后来用SQL事件探测器才发现是嵌套触发器的另一个触发器执行错误了,但A表的触发器错误不会回滚B表的数据,也就是说:
    当第一个Insert Into执行错误时,并不是这个Insert错误了,而是Insert所要操作的表的触发器发生错误了,但这样他还是继续执行后面两个delete的.
    现在问题已经解决了, 主要方法是该用存储过程的就要存储过程,减少了触发器嵌套层数.建议大家设计触发器时最好避免用嵌套, 多了很复杂,好像SQLSERVER 是不能超过32次嵌套的吧.不过还是谢谢大家. 结贴!