gpt4 book ai didi

oracle - 是否有可能知道给定查询会触发哪些触发器?

转载 作者:行者123 更新时间:2023-12-04 01:11:57 25 4
gpt4 key购买 nike

我有一个包含(太多)触发器的数据库。它们可以级​​联。

我有一个查询,看起来很简单,而且我绝不记得所有触发器的效果。所以,这个简单的查询实际上可能根本不简单,也没有达到我的预期。

有没有办法知道在运行查询之前会触发哪些触发器,或者在运行查询(尚未提交)之后触发了哪些触发器?

我对像 SELECT … FROM user_triggers WHERE … 这样的查询并不感兴趣因为我已经知道它们,还因为它没有告诉我在我的查询中是否满足触发器的触发条件。

谢谢

最佳答案

"I have a database with (too) many triggers. They can cascade."



这只是许多人诅咒触发器的原因之一。

"Is there a way to know what triggers would fire before running the query"



不。让我们考虑一下您可能会在 UPDATE 触发器主体中找到的内容:
if :new.sal > :old.sal * 1.2 then
insert into big_pay_rises values (:new.empno, :old.sal, :new.sal, sysdate);
end if;

我们如何判断 BIG_PAY_RISES 上的触发器是否会触发?它可能,也可能不依赖于我们无法从 DML 语句中解析出来的算法。

因此,您所能期望的最好结果是递归搜索 DBA_TRIGGERS 和 DBA_DEPENDENCIES 以识别可能在您的级联中出现的所有触发器。但是要确定在任何给定场景中肯定会触发哪些是不可能的。

" or what triggers have fired after running it (not committed yet)?"



正如其他人指出的那样,日志记录是一种选择。但如果您使用的是 Oracle 11g,您还有另一个选择:PL/SQL Hierarchical Profiler。这是一种非侵入式工具,可跟踪 PL/SQL 调用涉及的所有 PL/SQL 程序单元,包括触发器。 Hierarchical Profiler 的一个很酷的特性是它包含属于其他模式的 PU,这可能对级联触​​发器很有用。

因此,您只需要将您的 SQL 包装在一个匿名块中并使用 Hierarchical Profiler 调用它。然后您可以过滤您的报告以仅显示触发的触发器。 Find out more .

关于oracle - 是否有可能知道给定查询会触发哪些触发器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9395299/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com