Как в триггере для автоматического обновления данных указать условие на изменение столбца?

У меня есть две таблицы:

CREATE TABLE emp (
    emp_no NUMBER,
    emp_name VARCHAR2(50),
    salary NUMBER,
    manager VARCHAR2(50),
    dept_no NUMBER)
/
CREATE TABLE dept ( 
     Dept_no NUMBER, 
     Dept_name VARCHAR2(50),
     LOCATION VARCHAR2(50))
/

Я хотел бы иметь триггер со следующим условием: когда данные для столбца dept.dept_noизменяются вручную (новая запись, изменение предыдущей записи, удаление данных), столбец emp.dept_no должен обновляться автоматически.

Понимаю, что начало триггера должно быть:

CREATE OR REPLACE TRIGGER dept_no_update 
AFTER DELETE OR INSERT OR UPDATE ON dept FOR EACH ROW 
DECLARE 
BEGIN UPDATE emp ...

Как правильно задекларировать вторую часть и верно указать, что изменения должны происходить после внесения коррекций именно для колонки dept_no?


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

Автор решения: 0xdb

Условие, что измененился именно заданный столбец в таблице, следует указать оператором WHEN до PL/SQL блока, то есть в «первой части» триггера:

create or replace trigger dept_no_update 
after delete or update on dept for each row 
when (coalesce (new.dept_no, -old.dept_no ) != old.dept_no)
declare
begin 
    update emp set dept_no = :new.dept_no
    where dept_no = :old.dept_no; 
end;
/

Trigger DEPT_NO_UPDATE compiled

PS условие на срабатывание по INSERT опустил, так как в вопросе нет информации, что должно произойти в случая вставки новой записи.

→ Ссылка