【问题标题】:Compound triggers in oracleoracle 中的复合触发器
【发布时间】:2011-01-01 15:27:36
【问题描述】:

我有一个复合触发器,在 after 语句中我更新了另一个也有复合触发器的表,如下面的代码所示:

create or replace
trigger TRIGGER
for insert or update on TABLE
COMPOUND trigger

after STATEMENT is
begin
  update THEOTHERTABLE set VALUE = VALUE + 1 where COD = 1;
end after STATEMENT;
end;

更新只是一个简单的,看看是否有效。我希望它触发 THEOTHERTABLE 上的触发器,但它仅在触发器不复合时触发。

这是 Oracle 复合触发器的问题还是我不​​理解的一个特性?

【问题讨论】:

  • THEOTHERTABLE 上的触发器是什么样的?
  • 这是一个在 THEOTHERTABLE 更新时触发的简单触发器。我尝试在每行之前和之后的语句中输出到 dbms_output,它只是在编译触发器 TRIGGER 后第一次触发

标签: oracle plsql triggers oracle11g


【解决方案1】:

我已尝试重新创建您的场景,它似乎对我来说工作正常。所以我认为你应该再看看你的实现。寻找您编写的代码与后面的代码之间的差异,也许这就是答案所在。

这是我的触发器

SQL> create or replace
  2  trigger t1_compound
  3  for insert or update on t1
  4  compound trigger
  5
  6      after statement is
  7      begin
  8          update t2 set t1_id = nvl(t1_id,0) + 1 where cod = 12;
  9      end after statement;
 10  end;
 11  /

Trigger created.

SQL>
SQL> create or replace
  2  trigger t2_compound
  3  for insert or update on t2
  4  compound trigger
  5
  6      after statement is
  7      begin
  8          update t3 set t2_id = nvl(t2_id,0) + 1 where cod = 12;
  9      end after statement;
 10  end;
 11  /

Trigger created.

SQL>

...这里是测试数据...

SQL> select id, cod from t1
  2  /

        ID        COD
---------- ----------
         1         12

SQL> select id, cod, t1_id from t2
  2  /

        ID        COD      T1_ID
---------- ---------- ----------
        11         12

SQL> select id, cod, t2_id from t3
  2  /

        ID        COD      T2_ID
---------- ---------- ----------
       111         12

SQL> 

...当我在第一个表上发布更新时会发生这种情况...

SQL> update t1 set dt = sysdate
  2  where id = 1
  3  /

1 row updated.

SQL> select id, cod, t1_id from t2
  2  /

        ID        COD      T1_ID
---------- ---------- ----------
        11         12          1

SQL> select id, cod, t2_id from t3
  2  /

        ID        COD      T2_ID
---------- ---------- ----------
       111         12          1

SQL>

【讨论】:

    【解决方案2】:

    我认为它不应该工作...如果您为 THEOTHERTABLE 创建一个过程并从此触发器调用该过程会更好。

    【讨论】:

      【解决方案3】:

      如果您在编译触发器后执行此操作,但如果您再次尝试,即使使用其他数据,它也不会更新 THEOTHERTABLE

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-21
        • 2020-12-30
        • 2012-05-23
        • 2015-09-18
        • 2020-06-17
        • 2010-12-17
        • 2015-06-30
        相关资源
        最近更新 更多