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

Wil*_*rik 1 oracle triggers plsql rollback

如果我错了,请纠正我,但我的印象是调用 RAISE_APPLICATION_ERROR() 会强制回滚。为什么在 PL/SQL 触发器中允许调用 RAISE_APPLICATION_ERROR(),而不允许 ROLLBACK 语句和/或执行 ROLLBACK 语句的方法呢?

我感觉我错过了一个关键点:)

提前致谢!

Ale*_*ole 5

认为自己已得到纠正。有点。引发(或遇到)异常不会导致当前事务回滚。从文档中:

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

请注意,这是声明,而不是交易;但我想“角色恢复的效果”有点令人困惑......

每个语句周围都有一个隐式保存点,触发器异常会回滚到该保存点(after文档中提到的触发器等除外)。来自 Tom Kyte 的Oracle 数据库架构专家

Oracle 通过在我们对数据库的每个调用周围默默地包装一个 SAVEPOINT 来实现这种语句级原子性。