Как создать триггер, который проверяет, обновляется ли одно значение для определенных значений, все еще равных нулю, и если нет, обновляет таблицу - PullRequest
0 голосов
/ 15 февраля 2020

Как я могу создать триггер, который запускается обновлением, а затем проверяет, есть ли определенные значения в обновленной таблице, а другая таблица все еще пуста. Если нет, следует изменить значение в третьей таблице на 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, поэтому было бы замечательно, если бы кто-то мог помочь мне исправить эта ошибка.

1 Ответ

0 голосов
/ 15 февраля 2020

Основная проблема заключается в том, что вы пытаетесь прочитать строки в триггере уровня строки из целевой таблицы (с которой связана таблица, с которой связан триггер). Эта операция запрещена RDMS.

Общий подход к реализации функциональности заключается в использовании общей памяти триггерами или пакетами COMPOUND и достижении цели в несколько этапов.

Пожалуйста, прочитайте Initial топи c Тома Кайта о мутирующих таблицах и триггерах для изучения топи c.

Вот одно из сотен объяснений:

Ошибка мутации таблицы / триггера и как это решить

...