AFTER指定触发器只有在触发 SQL 语句中指定的所有操作都已成功执行后才激发。所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。如果仅指定 FOR 关键字,则 AFTER 是默认设置。不能在视图上定义 AFTER 触发器。
to gahade(与君共勉) 1、我完全理解你对一致性的解释,也完全理解对于Insead of 触发器跟insert语句是一个统一的整体事务. 2、我遇到的难题是,想找出一个不一致的东东,就是后面的触发操作对前面已完成的操作没有任何影响,我不要一致性,不一致才好呢,呵呵.(这就是我前面的说得发邮件的例子,比如插入成功了,我发邮件,如果我发不出邮件也不会影响之前的插入). 3、我之所以想不通不是你所说的触发器整体事务,而是细化分类的instead of触发器和after触发器的差别: instead of 是前触发,就是在执行sql语句前就把执行触发器。所以触发器不成功,后面的sql语句也执行不了,而且触发器成功的部分也回滚,一点问题也没有 after是后触发,既然是后触发,就应该有明显的与前触发的区别,可是站在用户角度,前触发后触发的结果是完全一样的,只要你触发器出错,我的数据就是插不进去。那还煞有介事的分什么instead of和after和for三种干什么,就设立一种触发器得了
to wgsasd311(自强不息) 如果after触发器按照下面定义,我就理解,但是目前的定义真是让人费解指定触发器只有在触发 SQL 语句中指定的所有操作都已执行但未提交时才激发。所有的引用级联操作和约束检查也必须已执行但未提交,才能执行此触发器。(原定义) 指定触发器只有在触发 SQL 语句中指定的所有操作都已成功执行后才激发。所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。如果仅指定 FOR 关键字,则 AFTER 是默认设置。
如果表没有任务约束或触发器,插入成功就成功了,但如果有的话它们就是一个整体事务,就像这样
begin tran
insert into 表
select '11'
触发器代码...成功后commit tran
挫败rollback tran.做为一个整体的事务是很有必要的,比如现在是在入库表上有触发器,触发器的代码是入库后库存增加,如果当更新库存时出错的话,入库的记录也保存到了,那何来的一致性呢?
如果是表约束我能理解,它的地位就相当于instead of触发器,要想一致,你通过我,无论哪一段出问题,都得有连带责任,一损俱损一荣俱荣。
你写的那段代码也是实际上after触发器运行的原理
begin tran
insert into 表
select '11'
触发器代码...成功后commit tran
挫败rollback tran
但是我就不明白了,触发器若不是为了保证一致性的需求,比如我入库后就发一个邮件提醒给管理员,你总不能因为邮件发不成功不让我入库,入库的紧急程度总比发一封提醒邮件的紧急程度高很多啊,而且我也一直理解after触发器是为了满足这种需求而生的。
如果实在不能满足,兄台有好的解决办法么?现在我头疼死了。
insert语句和insert触发器为一个整体.
insert后触发insert触发器,insert触发器影响insert结果.按楼主的理解就是insert语句可以触发触发器,但触发器不影响insert语句
就是A到B,但B不能到A,
那么当向表insert时,再向另一表插入数据的功能如何实现?
楼主不觉得你的想法矛盾了吗?
楼主不觉得你的想法矛盾了吗?兄台,我还是不明白这句是什么意思?只是一个单向流程,A数据插入后,成功了,有个返回告诉系统,系统会通知触发器,你干活吧,那边人家已经结帐了,然后触发器就干活。这样应该没有问题滴啊,脑子蒙蒙的
楼主理解了事务,为什么不理解触发器呢?如果是数据逻辑导致的错误是和触发器本身没有关系的.
1、我完全理解你对一致性的解释,也完全理解对于Insead of 触发器跟insert语句是一个统一的整体事务.
2、我遇到的难题是,想找出一个不一致的东东,就是后面的触发操作对前面已完成的操作没有任何影响,我不要一致性,不一致才好呢,呵呵.(这就是我前面的说得发邮件的例子,比如插入成功了,我发邮件,如果我发不出邮件也不会影响之前的插入).
3、我之所以想不通不是你所说的触发器整体事务,而是细化分类的instead of触发器和after触发器的差别:
instead of 是前触发,就是在执行sql语句前就把执行触发器。所以触发器不成功,后面的sql语句也执行不了,而且触发器成功的部分也回滚,一点问题也没有
after是后触发,既然是后触发,就应该有明显的与前触发的区别,可是站在用户角度,前触发后触发的结果是完全一样的,只要你触发器出错,我的数据就是插不进去。那还煞有介事的分什么instead of和after和for三种干什么,就设立一种触发器得了
如果after触发器按照下面定义,我就理解,但是目前的定义真是让人费解指定触发器只有在触发 SQL 语句中指定的所有操作都已执行但未提交时才激发。所有的引用级联操作和约束检查也必须已执行但未提交,才能执行此触发器。(原定义)
指定触发器只有在触发 SQL 语句中指定的所有操作都已成功执行后才激发。所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。如果仅指定 FOR 关键字,则 AFTER 是默认设置。