До удаления триггер не срабатывает - PullRequest
0 голосов
/ 05 января 2019

Следующий триггер был создан правильно, и он запускается перед инструкциями UPDATE и INSERT. Но он ничего не отображает, когда выдается команда DELETE stmt. Пожалуйста, помогите мне определить проблему здесь.

create or replace trigger tr_emp_saldiff
BEFORE INSERT OR UPDATE OR DELETE
ON emp
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
WHEN (new.emp_no > 0)
declare
    sal_diff number;
begin
    sal_diff  := :new.salary  - :old.salary;
    dbms_output.put(' Old salary: ' || :old.salary);
    dbms_output.put('  New salary: ' || :new.salary);
    dbms_output.put_line('  Difference ' || sal_diff);
END;
/

UPDATE emp set salary = salary + 500 where dept_no = 10;
Output :
1 row(s) updated.
Old salary: 20500 New salary: 21000 Difference 500

INSERT INTO EMP VALUES(1000,'Alice',15000,'Fiona',30);
Output :
1 row(s) inserted.
Old salary: New salary: 20000 Difference 

DELETE FROM emp where emp_name='Jane';
Output :
1 row(s) deleted.

Никакие значения не отображаются после оператора удаления.

1 Ответ

0 голосов
/ 05 января 2019
WHEN (new.emp_no > 0)

Это не может быть правдой для DELETE, new.emp_no тогда равно нулю.

Удалите это условие или используйте отдельный триггер на DELETE. (Как и дано, оно все равно имеет смысл только для UPDATE. Никаких изменений в окладе у INSERT или DELETE нет.)

...