Oracle 为什么不允许在PL/SQL触发器中使用ROLLBACK语句,但RAISE_应用程序_错误是错误的?

Oracle 为什么不允许在PL/SQL触发器中使用ROLLBACK语句,但RAISE_应用程序_错误是错误的?,oracle,plsql,triggers,rollback,Oracle,Plsql,Triggers,Rollback,如果我错了,请纠正我,但我的印象是调用RAISE\u APPLICATION\u ERROR()会强制回滚。当回滚语句和/或执行回滚语句的方法不可用时,PL/SQL触发器中怎么可能允许调用RAISE_APPLICATION_ERROR() 我觉得我错过了一个关键点:) 提前谢谢 在触发器内部,RAISE_应用程序_错误不会执行回滚,它会中止当前操作,即单个更新/插入/删除。触发器中的所有内容都属于这样的操作(这也是著名错误“ORA-04091-表正在变化,触发器/函数可能看不到它”的原因) 回滚

如果我错了,请纠正我,但我的印象是调用RAISE\u APPLICATION\u ERROR()会强制回滚。当回滚语句和/或执行回滚语句的方法不可用时,PL/SQL触发器中怎么可能允许调用RAISE_APPLICATION_ERROR()

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


提前谢谢

在触发器内部,RAISE_应用程序_错误不会执行回滚,它会中止当前操作,即单个更新/插入/删除。触发器中的所有内容都属于这样的操作(这也是著名错误“ORA-04091-表正在变化,触发器/函数可能看不到它”的原因)


回滚会还原当前事务中(或给定保存点之前)的所有更改,这是不同的。

在触发器中,如果出现RAISE\u应用程序错误,则不会执行回滚,它会中止当前操作,即单个更新/插入/删除。触发器中的所有内容都属于这样的操作(这也是著名错误“ORA-04091-表正在变化,触发器/函数可能看不到它”的原因)


回滚将还原当前事务中(或给定保存点之前)的所有更改,这是不同的。

请认为您已更正。某种程度上。引发(或遇到)异常不会导致当前事务回滚。发件人:

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

请注意,这是一个声明,而不是交易;但是“角色背后的影响”有点让人困惑,我想

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

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


认为自己被纠正了。某种程度上。引发(或遇到)异常不会导致当前事务回滚。发件人:

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

请注意,这是一个声明,而不是交易;但是“角色背后的影响”有点让人困惑,我想

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

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


我正在上一门关于PL/SQL的课程(这是我的第一年),我们使用的书(荷兰语)指定在调用RAISE\u APPLICATION\u ERROR()后进行回滚。我想我必须和作者谈谈,以澄清语句“回滚”和实际回滚的区别:)请允许我补充一点,触发器中的
commit
rollback
是非常糟糕的做法。如果触发器发现错误,它应该引发一个信息异常,并允许围绕DML语句的代码确定应该做什么(如果有的话)。根据触发器无法察觉的情况,最好的操作过程可以是继续,执行部分回滚或中止整个操作。这些都不是可以由触发器正确做出的决定。我正在上一门PL/SQL课程(这是我的第一年),我们使用的书(荷兰语)规定在调用RAISE\u APPLICATION\u ERROR()后进行回滚。我想我必须和作者谈谈,以澄清语句“回滚”和实际回滚的区别:)请允许我补充一点,触发器中的
commit
rollback
是非常糟糕的做法。如果触发器发现错误,它应该引发一个信息异常,并允许围绕DML语句的代码确定应该做什么(如果有的话)。根据触发器无法察觉的情况,最好的操作过程可以是继续,执行部分回滚或中止整个操作。这些都不是可以由触发器正确做出的决定。