after触发器,为什么当触发器插入数据出错,(故意设置触发器语法插入另外表时不正确)却把所有之前的insert到表的数据也搞没了,不是后触发么,就算回滚,滚人家干嘛,死活想不明白!

解决方案 »

  1.   

    对于instead of触发,我能理解。但是对于after我实在想不明白,不是说是insert成功之后才触发么,应该是两个独立的事务的,你成功,我干活,我干不成,我自己负责。况且也有很多这样的业务需求,为什么非要滚人家,自己干不好,非把人家干好的也拉下水。
      

  2.   

    这就像如果insert时违反了主键或约束时,数据也同样会同滚的道理一样.
    如果表没有任务约束或触发器,插入成功就成功了,但如果有的话它们就是一个整体事务,就像这样
    begin tran
    insert into 表
    select '11'
    触发器代码...成功后commit tran
    挫败rollback tran.做为一个整体的事务是很有必要的,比如现在是在入库表上有触发器,触发器的代码是入库后库存增加,如果当更新库存时出错的话,入库的记录也保存到了,那何来的一致性呢?
      

  3.   

    to gahade(与君共勉) 
    如果是表约束我能理解,它的地位就相当于instead of触发器,要想一致,你通过我,无论哪一段出问题,都得有连带责任,一损俱损一荣俱荣。
    你写的那段代码也是实际上after触发器运行的原理
    begin tran
    insert into 表
    select '11'
    触发器代码...成功后commit tran
    挫败rollback tran
    但是我就不明白了,触发器若不是为了保证一致性的需求,比如我入库后就发一个邮件提醒给管理员,你总不能因为邮件发不成功不让我入库,入库的紧急程度总比发一封提醒邮件的紧急程度高很多啊,而且我也一直理解after触发器是为了满足这种需求而生的。
    如果实在不能满足,兄台有好的解决办法么?现在我头疼死了。
      

  4.   

    SQL只认xp_sendmail的返回值是否成功,如果发送成功后,邮件邮件服务器崩溃了或停电了,SQL不会知道也不会回滚.
      

  5.   

    对事务概念还算比较理解,关键是after触发器的现象不是 仅仅触发器在一个事务里,是它把insert动作也给包含到这个事务里了,这点难以接受。
      

  6.   

    如果insert 数据到表A,我在触发器里把插入数据 插入到表B,恰恰表B根A没有一致性的关联,顶多是以日志的方式记录,成不成功都问题不大。但是现在就找不出一种触发器让A成功插入后,B插入失败却不影响到A表已插入的数据,是业务的要求,本来用sp控制会好很多,可是啊,被挤到这了,费用这倒霉的触发器。
      

  7.   

    理解问题.
    insert语句和insert触发器为一个整体.
    insert后触发insert触发器,insert触发器影响insert结果.按楼主的理解就是insert语句可以触发触发器,但触发器不影响insert语句
    就是A到B,但B不能到A,
    那么当向表insert时,再向另一表插入数据的功能如何实现?
    楼主不觉得你的想法矛盾了吗?
      

  8.   

    那么当向表insert时,再向另一表插入数据的功能如何实现?
    楼主不觉得你的想法矛盾了吗?兄台,我还是不明白这句是什么意思?只是一个单向流程,A数据插入后,成功了,有个返回告诉系统,系统会通知触发器,你干活吧,那边人家已经结帐了,然后触发器就干活。这样应该没有问题滴啊,脑子蒙蒙的
      

  9.   

    insert语句和insert触发器是一个整体的事务~!
    楼主理解了事务,为什么不理解触发器呢?如果是数据逻辑导致的错误是和触发器本身没有关系的.
      

  10.   

    AFTER指定触发器只有在触发 SQL 语句中指定的所有操作都已成功执行后才激发。所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。如果仅指定 FOR 关键字,则 AFTER 是默认设置。不能在视图上定义 AFTER 触发器。
      

  11.   

    to gahade(与君共勉) 
    1、我完全理解你对一致性的解释,也完全理解对于Insead of 触发器跟insert语句是一个统一的整体事务.
    2、我遇到的难题是,想找出一个不一致的东东,就是后面的触发操作对前面已完成的操作没有任何影响,我不要一致性,不一致才好呢,呵呵.(这就是我前面的说得发邮件的例子,比如插入成功了,我发邮件,如果我发不出邮件也不会影响之前的插入).
    3、我之所以想不通不是你所说的触发器整体事务,而是细化分类的instead of触发器和after触发器的差别:
    instead of 是前触发,就是在执行sql语句前就把执行触发器。所以触发器不成功,后面的sql语句也执行不了,而且触发器成功的部分也回滚,一点问题也没有
    after是后触发,既然是后触发,就应该有明显的与前触发的区别,可是站在用户角度,前触发后触发的结果是完全一样的,只要你触发器出错,我的数据就是插不进去。那还煞有介事的分什么instead of和after和for三种干什么,就设立一种触发器得了
      

  12.   

    to wgsasd311(自强不息) 
    如果after触发器按照下面定义,我就理解,但是目前的定义真是让人费解指定触发器只有在触发 SQL 语句中指定的所有操作都已执行但未提交时才激发。所有的引用级联操作和约束检查也必须已执行但未提交,才能执行此触发器。(原定义)
    指定触发器只有在触发 SQL 语句中指定的所有操作都已成功执行后才激发。所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。如果仅指定 FOR 关键字,则 AFTER 是默认设置。