Написать триггер для перезаписи ячеек внутри таблицы
Необходимо написать триггер для поддержания работы со старыми наименованиями и новыми. БД 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 шт):
Будет это работать? Если не будет, то почему?
Мутация. Нельзя читать или изменять данные в той же таблице, на которой висит триггер.
Можно только взять данные колонок изменяемой строки и только в пределах этой строки как-то изменить данные (не уверен что понятно объяснил, спрашиваете, поясню на примерах).
Можно выбрать данные из другой таблицы. Но если полезешь в это же таблицу - мутация, ошибка ORA-04091.