为什么不允许在PL / SQL触发器中使用ROLLBACK语句,但是RAISE_APPLICATION_ERROR是?

时间:2014-06-11 13:01:15

标签: oracle plsql triggers rollback

如果我错了,请纠正我,但我的印象是调用RAISE_APPLICATION_ERROR()会强制ROLLBACK。当执行ROLLBACK语句的ROLLBACK语句和/或方法不在PL / SQL触发器中时,如何允许对RAISE_APPLICATION_ERROR()进行调用?

我觉得我在这里错过了一个关键点:)

提前致谢!

2 个答案:

答案 0 :(得分:3)

考虑自己纠正。有点。提升(或遇到)异常并不会导致软件事务的回滚。来自the documentation

  

在大多数情况下,如果触发器运行引发异常的语句,并且异常不由异常处理程序处理,则数据库将回滚触发器及其触发语句的效果。

请注意,它是声明,而不是交易;但是"角色支持"我觉得有点混乱...

每个语句都有一个隐式保存点,触发器异常会回滚到该保存点(after触发器除外,如文档中所述)。来自Tom Kyte的 Expert Oracle Database Architecture

  

Oracle通过静默包装SAVEPOINT aroind我们对数据库的每次调用来实现这个语句级别的原子性。

答案 1 :(得分:2)

在触发器内RAISE_APPLICATION_ERROR不执行ROLLBACK,它会中止当前操作,即单个UPDATE / INSERT / DELETE。触发器内的所有内容都属于这样的操作(这也是着名错误的原因" ORA-04091 - 表正在变异,触发器/功能可能看不到它")。

回滚会恢复当前事务(或最多给定的保存点)内的所有更改,这些更改会有所不同。