我在表A上有一个更新后的触发器(触发器A),可以对表B进行更改。
我还在表B上有一个更新后的触发器(触发器B),它没有做任何更改,但查询表A对非规范化的一些健全性检查。
因此触发器B可以通过以下两种方式之一触发:
在案例2中,我得到一个ORA-04091:表名是变异的,触发器/函数可能看不到错误。这似乎是正确的。
我想在触发器B中检查表A是否处于“处于错误状态”并提前退出(在这种情况下不需要运行健全性检查)。
在触发器内测试此功能的最佳方法是什么?只需添加一个吞下异常的异常处理程序?还有什么比较优雅的吗?
答案 0 :(得分:2)
你可以让A上的触发器做一些事情来警告B上的触发器它不需要触发。有各种各样的想要为会话设置一些状态。最简单的方法是在A上设置bypass_checks_on_b
之前创建一个设置为TRUE
的布尔变量UPDATE
的包,设置为FALSE
一旦UPDATE
完成,然后在进行验证之前检查B上触发器中此变量的状态。您可以使用临时表或上下文执行类似操作,而不是使用包。效率较低,您可能会在B上的触发器内解析调用堆栈,以查看A上的触发器是否在调用堆栈中,但这样做会相当丑陋。