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

Posted

技术标签:

【中文标题】如何在 Oracle 中定义一个触发器 ON COMMIT?【英文标题】:How to define a trigger ON COMMIT in Oracle? 【发布时间】:2011-05-05 04:02:20 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

谢谢。选项 #1 对我来说很方便。 当然是一个很好的解决方案。只需考虑一下,ON COMMIT REFRESH 是当前事务的一部分,并且会延迟提交,直到刷新完成为止。如果 FAST REFRESH 复杂且不够快,它可能会减慢整个应用程序并导致更多的阻塞和锁定。如果 FAST REFRESH 不可行,那么可以考虑通过常规作业进行异步刷新。【参考方案2】:

我遇到了类似的问题,但不幸的是,选项 1 不适合我的情况。

“Ask Tom”也建议的另一种可能的解决方案是指定一个存储过程并在执行 COMMIT 之前简单地调用该过程。 此解决方案仅在您有权访问执行 COMMIT 的代码时才方便,但对我而言,这是最简单的解决方案。

【讨论】:

以上是关于如何在 Oracle 中定义一个触发器 ON COMMIT?的主要内容,如果未能解决你的问题,请参考以下文章

oracle索引视图存储过程触发器oracle数据类型

Oracle:新增用户登录提示“ORA-04098:触发器‘GD.ON_LOGON_TRIGGER’无效且未通过重新验证”

oracle中的trigger有几种啊

如何在 azure 函数 http 触发器中触发失败,并带有自定义错误响应

v-on:click 永远不会触发 Nuxt 组件中的按钮,因为中间件

oracle中触发器有啥作用