如何创建一个触发器,用于检查何时更新一个值以使定义的值仍然为空,如果不是,则更新表

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

如何创建由更新触发的触发器,然后检查更新表中是否存在某些值,而另一个表是否仍为空。如果不是,则应将第三个表中的值更改为sysdate。

我的代码:

    CREATE OR REPLACE TRIGGER TRG_UPDATE_VALUE
        BEFORE UPDATE OF column1
        ON table1
    REFERENCING OLD AS OLD NEW AS NEW
        for each row
    DECLARE
        value_one_null int;
        value_two_null int;

    BEGIN
        SELECT COUNT(table1_id)
        INTO value_one_null
        FROM table1
        WHERE column1 IS NULL
        AND column2 = :NEW.column2;

        SELECT COUNT(table2_id)
        INTO value_two_null
        FROM table2
        WHERE column1 IS NULL
        AND column2 = :NEW.column2;

        IF (value_one_null = 0 AND value_two_null = 0)
            THEN
            UPDATE table3 SET table3.column1 = sysdate 
                WHERE table3_id = :NEW.column2;
        END IF;
    END;

编译触发器的工作原理。但是,如果我尝试更新表1,则会报错ORA-04091,ORA-06512,ORA-04088

我是PL / SQL的初学者,所以如果有人可以帮助我解决此错误,这将是惊人的。

sql oracle plsql oracle-sqldeveloper database-trigger
1个回答
0
投票

主要问题是您试图从目标表(与该触发器相关联的表)中读取行级触发器中的行。RDMS禁止此操作。

实现该功能的一般方法是将程序包中的PL / SQl集合用作公用内存或使用COMPOUND触发器。

请阅读汤姆·凯特(Tom Kyte)的有关更改表和触发器的初始主题,以学习该主题。

这里是数百种解释之一:

Mutating table/trigger error and how to resolve it

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