是否有可能知道在给定查询时会触发什么触发器?

时间:2012-02-22 13:03:12

标签: oracle triggers

我有一个数据库(太多)触发器。他们可以级联。

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

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

我对SELECT … FROM user_triggers WHERE …之类的查询并不感兴趣,因为我已经了解它们,也因为它没有告诉我在查询中是否会满足触发器的触发条件。

由于

3 个答案:

答案 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