Написать триггер для перезаписи ячеек внутри таблицы

Необходимо написать триггер для поддержания работы со старыми наименованиями и новыми. БД Oracal. Первый раз с триггерами столкнулся. Не могу разобраться - запутался с разными БД и разным ситаксисом.

Есть Таблица TABLE c событиями и их параметрами. event_type| param_1 | param_2 | param_3 | param_4

При добавлении или обновлении записи должны заполнится все поля таблицы по следующим правилам: При записи в БД event_1 пишет param_1 и param_2 => param_3=param_1, param_4=param_2 При записи в БД event_2 или event_3 или event_4 пишет param_3 и param_2 => param_1=param_3, param_4=param_2 При записи в БД event_5 и т.д. триггер не отрабатывает. Или по крайней мере ни чего не переписывает Соответственно перезапись должна происходить при добавлении новой записи в таблицу или обновлении соответствующих полей в текущей таблице

CREATE OR REPLACE TRIGGER tr
    AFTER INSERT OR UPDATE
    ON table
FOR EACH ROW
    BEGIN
        CASE
            WHEN INSERTING THEN
                UPDATE table t SET
                    param_3=param_1,
                    param_4=param_2
                WHERE event_type = 'event_1' and
                t.id = inserted.id;
                UPDATE table o SET
                    param_1=param_3,
                    param_4=param_2
                WHERE event_type IN
                ('event_2', 'event_3', 'event_4') and
                t.id = inserted.id;
            WHEN UPDATING('param_1') THEN 
                UPDATE table o SET
                    param_1=param_3,
                WHERE event_type = 'event_1' and
                t.id = inserted.id;
            WHEN UPDATING('param_3') THEN 
                UPDATE table t SET
                    param_3=param_1,
                WHERE event_type IN
                ('event_2', 'event_3', 'event_4') and
                o.id = inserted.id;
            WHEN UPDATING ('param_2') THEN
                UPDATE table SET
                    param_4=param_2,
                WHERE event_type IN
                ('event_1','event_2', 'event_3', 'event_4') and
                t.id = inserted.id;
        END CASE;
    END;

Будет это работать? Если не будет, то почему?

Конечно всё осложняется тем, что в реальной задаче 10 типов событий и 15 параметров.


Ответы (1 шт):

Автор решения: jashka34

Будет это работать? Если не будет, то почему?

Мутация. Нельзя читать или изменять данные в той же таблице, на которой висит триггер.

Можно только взять данные колонок изменяемой строки и только в пределах этой строки как-то изменить данные (не уверен что понятно объяснил, спрашиваете, поясню на примерах).

Можно выбрать данные из другой таблицы. Но если полезешь в это же таблицу - мутация, ошибка ORA-04091.

→ Ссылка