我有一个数据库(太多)触发器.他们可以级联.
我有一个查询,看起来很简单,绝不是我能记住所有触发器的效果.所以,这个简单的查询实际上可能并不简单,也不能达到我的预期.
有没有办法知道在运行查询之前会触发什么触发器,或者在运行它之后触发了什么触发器(尚未提交)?
我对查询并不感兴趣,SELECT … FROM user_triggers WHERE …
因为我已经了解它们,也因为它没有告诉我在我的查询中是否会满足触发器的触发条件.
谢谢
“我有一个包含太多触发器的数据库。它们可以级联。”
这只是许多人厌恶触发器的原因之一。
“有没有办法知道在运行查询之前会触发哪些触发器”
不。让我们考虑一下您可能会在 UPDATE 触发器主体中找到的内容:
if :new.sal > :old.sal * 1.2 then
insert into big_pay_rises values (:new.empno, :old.sal, :new.sal, sysdate);
end if;
Run Code Online (Sandbox Code Playgroud)
我们如何判断 BIG_PAY_RISES 上的触发器是否会触发?可能,也可能不取决于我们无法从 DML 语句中解析出的算法。
因此,您所能期望的最好结果就是递归搜索 DBA_TRIGGERS 和 DBA_DEPENDENCIES,以识别级联中可能出现的所有触发器。但不可能确定哪些在任何给定情况下肯定会触发。
“或者运行它后触发了哪些触发器(尚未提交)?”
正如其他人指出的那样,日志记录是一种选择。但如果您使用 Oracle 11g,您还有另一个选择:PL/SQL Hierarchical Profiler。这是一个非侵入式工具,可跟踪 PL/SQL 调用涉及的所有 PL/SQL 程序单元,包括触发器。分层探查器的一项很酷的功能是它包含属于其他模式的 PU,这对于级联触发器可能很有用。
因此,您只需将 SQL 包装在匿名块中并使用层次分析器调用它即可。然后,您可以过滤报告以仅显示触发的触发器。 了解更多。