oracle行级触发器与其他触发器冲突

问题描述 投票:0回答:1

我有一个行级触发器,可以在值更改时更新另一个表。但表上还有很多其他触发器,无法提供执行顺序。那么复合触发器可能是一个解决方案吗?但我在互联网上找不到它的正确拼写。这是我当前的代码:

create or replace TRIGGER my_trigger AFTER 
    INSERT OR UPDATE OF column1 ON my_table_1
    FOR EACH  ROW
DECLARE

BEGIN
    IF
        :new.my_table_1.column1 > 1
    THEN
        UPDATE my_table_2
        SET
            column2 = 1
        WHERE
                column_id1 = :new.column_id1
            AND column_id2 = :new.column_id2;
    END IF;
END my_trigger;
oracle triggers
1个回答
0
投票

如果您需要按特定顺序执行操作,则不要在多个触发器中执行这些操作。

要么:

  1. 将所有触发器组合成一个触发器,您可以在触发器主体的 PL/SQL 中控制顺序;或
  2. 从使用触发器转向过程。

所以如果你有两个触发器:

CREATE TRIGGER my_trigger1
  BEFORE INSERT OR UPDATE OF column2 ON my_table_1
  FOR EACH  ROW
DECLARE
BEGIN
  IF :new.column2 := 'SOMETHING' THEN
    :new.column1 = 1;
  END;
END my_trigger1;
/

CREATE TRIGGER my_trigger
  AFTER INSERT OR UPDATE OF column1 ON my_table_1
  FOR EACH  ROW
DECLARE
BEGIN
  IF :new.column1 > 1 THEN
    UPDATE my_table_2
    SET   column2 = 1
    WHERE column_id1 = :new.column_id1
    AND   column_id2 = :new.column_id2;
  END IF;
END my_trigger2;
/

然后你可以将其更改为:

CREATE TRIGGER my_trigger
FOR INSERT OR UPDATE OF column1, column2 ON my_table_1
COMPOUND TRIGGER
BEFORE EACH ROW
  IS
  BEGIN
    IF :new.column2 = 'SOMETHING' THEN
      :new.column1 := 2;
    END IF;
  END BEFORE EACH ROW;  
AFTER EACH ROW
  IS
  BEGIN
    IF :new.column1 > 1 THEN
      UPDATE my_table_2
      SET   column2 = 1
      WHERE column_id1 = :new.column_id1
      AND   column_id2 = :new.column_id2;
    END IF;
  END AFTER EACH ROW;  
END;
/

(注意:在这种情况下,顺序不会改变,因为一个是

BEFORE
,另一个是
AFTER
触发器,但您应该明白,如果您有多个
BEFORE
AFTER
触发器,那么您可以将它们全部组合成一个触发器。)

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.