如何在Oracle中定义触发器ON COMMIT?

Vol*_*lov 21 sql oracle triggers plsql

oracle数据库中是否有任何方法可以定义在COMMIT之前同步触发的触发器(如果抛出异常则抛出ROLLBACK)以防指定表被更改?

Vin*_*rat 33

Oracle中没有ON COMMIT触发机制.但是有一些解决方法:

  1. 您可以使用带有ON COMMIT REFRESH的物化视图,并为此MV添加触发器.这将允许您在提交时修改基表时触发逻辑.如果触发器引发错误,则事务将回滚(您将丢失所有未经修改的更改).

  2. 您可以使用DBMS_JOB在提交后将操作推迟到.这将是一个异步操作,在某些情况下可能是合乎需要的(例如,当您想要在事务成功后发送电子邮件时).如果您回滚主要事务,则该作业将被取消.作业和主会话是独立的:如果作业失败,则不会回滚主事务.

在您的情况下,您可以使用选项(1).我个人不喜欢在触发器中编写业务逻辑,因为它增加了很多复杂性,但从技术上讲,我认为它是可行的.