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

时间:2010-11-04 16:18:54

标签: sql oracle plsql triggers

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

2 个答案:

答案 0 :(得分:28)

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

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

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

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

答案 1 :(得分:1)

我有一个类似的问题,但遗憾的是,选项1对我的情况不方便。

“Ask Tom”也提出了另一种可能的解决方案,即指定存储过程并在执行COMMIT之前简单地调用该过程。 只有在您可以访问执行COMMIT的代码时,此解决方案才是方便的,但对于我的情况,这是最简单的解决方案。