我有一个行级触发器,可以在值更改时更新另一个表。但表上还有很多其他触发器,无法提供执行顺序。那么复合触发器可能是一个解决方案吗?但我在互联网上找不到它的正确拼写。这是我当前的代码:
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;
如果您需要按特定顺序执行操作,则不要在多个触发器中执行这些操作。
要么:
所以如果你有两个触发器:
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
触发器,那么您可以将它们全部组合成一个触发器。)