【问题标题】:Is it possible to know what triggers would fire given a query?是否有可能知道给定查询会触发哪些触发器?
【发布时间】:2012-03-12 19:27:13
【问题描述】:

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

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

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

我对@9​​87654321@ 之类的查询并不真正感兴趣,因为我已经知道它们,而且它并没有告诉我在我的查询中是否会满足触发器的触发条件。

谢谢

【问题讨论】:

  • 我不知道模拟触发器执行的方法,但是如果您能够更改触发器主体,您可能想要添加一些日志语句,例如插入带有名称和时间戳的专用表。顺便说一句:如果你使用的是 11g,你应该看看复合触发器......
  • @Toby,添加日志语句是一个想法……但这意味着将它们全部重写。将研究复合触发器,但我们仍有客户使用 9i。

标签: oracle triggers


【解决方案1】:

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

这只是许多人厌恶触发器的原因之一。

“有没有办法在运行之前知道触发器会触发什么? 查询”

没有。让我们考虑一下您可能会在 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.

【讨论】:

  • 这正是我想要的,谢谢。我想在 10g 的情况下,我们只能使用普通的旧日志,但我们的一些测试数据库是 11g。
【解决方案2】:

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

为了解决这个问题,我将使用 PL/SQL 调试器在匿名块内运行查询。

【讨论】:

    【解决方案3】:

    没有所谓的通过您的查询解析并为您提供查询中涉及的触发器的东西。它会像这样简单。只需从您正在运行的查询中选择表名,并在运行查询之前使用以下查询为每个表列出触发器。这还不够简单吗?

    select  trigger_name
    ,   trigger_type
    ,   status
    from    dba_triggers
    where   owner = '&owner'
    and table_name = '&table'
    order by status, trigger_name
    

    【讨论】:

    • 恐怕没那么简单。它是递归的——您更新表 A,它会触发一个更新行触发器,该触发器将一条记录插入表 B(可能还有 3 个其他表,语句触发器上还有 2 个更改)。那些对表 C 执行某些操作的触发触发器。等等。您可以通过跟踪依赖关系来更接近,至少跟踪可能受到影响的所有可能触发器的集合。但不仅仅是那些真正会开火的。
    • 这正是我的意思,我给出的查询只针对一张表,而不是针对所有表
    猜你喜欢
    • 2012-10-23
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多