我有一个数据库(太多)触发器。他们可以级联。
我有一个查询,看起来很简单,绝不会记住所有触发器的效果。所以,这个简单的查询实际上可能并不简单,也不能达到我的预期。
有没有办法知道在运行查询之前会触发什么触发器,或者在运行它之后触发了什么触发器(尚未提交)?
我对SELECT … FROM user_triggers WHERE …
之类的查询并不感兴趣,因为我已经了解它们,也因为它没有告诉我在查询中是否会满足触发器的触发条件。
由于
答案 0 :(得分:3)
“我有一个(太多)触发器的数据库。它们可以级联。”
这只是许多人诅咒触发器的原因之一。
“有没有办法知道在运行之前会触发什么触发器 查询“
没有。让我们考虑一下你可能在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,以识别级联中可能功能的所有触发器。但是,在任何特定情况下,都无法确定哪些肯定会发射。
“或者在运行它之后触发了什么触发器(尚未提交)?”
正如其他人所指出的,记录是一种选择。但是,如果您使用的是Oracle 11g,则还有另一种选择:PL / SQL Hierarchical Profiler。这是一个非侵入式工具,它跟踪PL / SQL调用触及的所有PL / SQL程序单元,包括触发器。 Hierarchical Profiler的一个很酷的功能是它包含属于其他模式的PU,这对于级联触发器可能很有用。
因此,您只需将SQL包装在匿名块中并使用Hierarchical Profiler调用它。然后,您可以过滤报告以仅显示触发的触发器。 Find out more。
答案 1 :(得分:1)
有没有办法知道在运行查询之前触发了什么触发器,或运行它后触发了什么触发器(尚未提交)?
为了解决这个问题,我将使用PL / SQL调试器在匿名块内运行查询。
答案 2 :(得分:0)
在您的查询中没有称为parse的东西,并为您提供查询中涉及的触发器。它会像这一样简单。只需从正在运行的查询中选择表名,并在运行查询之前使用以下查询列出触发器。这不够简单吗?
select trigger_name
, trigger_type
, status
from dba_triggers
where owner = '&owner'
and table_name = '&table'
order by status, trigger_name