如何避免在触发器中ORA-04091错误(How to avoid ORA-04091 error

2019-07-28 22:47发布

我桌子上的一个更新触发器(触发A),它可以更改表B.后有

我也有一个对表B,这使得任何更改更新触发器(触发B)之后,但查询表格中的一些理智上的非规范化检查。

因此触发B能火的两种方法之一:

  1. 如果我直接更新表B,或
  2. 如果我更新表A和引发火灾,造成更新表B.

在第二种情况下,我得到一个ORA-04091:表名称变异,触发/功能可能看不到它的错误。 这似乎是正确的。

我想触发B内部检查表A的“状态不佳”,并提前退场(的完整性检查就不需要在这种情况下运行)。

什么是我的触发器中测试的最佳方式? 只需添加这燕子异常的异常处理程序? 有什么更优雅?

Answer 1:

你可以有上触发做些什么,提醒B中不需要触发触发器。 有各种希望建立一些状态的会话。 最简单可行的方法是做一些像创建一个布尔变量包bypass_checks_on_b你设置为TRUE ,你做之前UPDATE上A,设置为FALSE ,一旦UPDATE完成,然后检查你的触发此变量的状态做您的验证之前,B中。 你可以做一个临时表或上下文以及而非使用包类似的东西。 效率低,你可能解析调用堆栈的触发器内第B,看看如果在触发器是在调用栈,但会倾向于比较难看。

我是这整个架构非常谨慎,虽然。 当你发现你有一个对这一事业的B触发火灾触发想查询A,它几乎总是你已经把太多的逻辑触发的情况下,并且你要好得多服活动该逻辑转换成可以被称为,而不是做直接插入或更新应用程序的存储的过程层。 当你把太多的逻辑为触发器,你结束了一个系统,是很难理解的,因为它是从着眼于应用程序代码的各种语句有什么样的副作用并不明显。 和你结束了,你必须通过根据呼叫者单件的代码许多路径非常有状态的代码。 这几乎肯定意味着会有你不测试或不认为在那里你会发现你的代码做一些意想不到的状态。 有一吨的状态,并具有一吨的副作用的代码库之间,你很快就可以建立一个代码库,基本上是不可维护的。



文章来源: How to avoid ORA-04091 error within a trigger