В Oracle има две нива на тригери:ниво на ред и ниво на таблица.
Тригерите на ниво ред се изпълняват for each row
. Тригери на ниво таблица, изпълнявани за оператор, дори ако операторът е променил повече от един ред.
В тригер на ниво ред не можете да изберете/актуализирате самата таблица, която има тригера:ще получите мутираща грешка.
В този случай няма нужда от оператор UPDATE. Просто опитайте това:
CREATE OR REPLACE TRIGGER aso_quote_cuhk_trigger
BEFORE INSERT
ON aso.aso_quote_headers_all
FOR EACH ROW
BEGIN
:new.quote_expiration_date=sysdate+90;
END;
/
РЕДАКТИРАНЕ Раджеш спомена, че е възможно, преди да вмъкне нов ред, OP да иска да актуализира всички други записи в aso_quote_headers_all
таблица.
Е, това е осъществимо, но е малко сложно. За да направите това правилно, ще ви трябва
- Пакет pl/sql и променлива в заглавката на пакета, която е модифицирана от тригерите. Тази променлива може да бъде списък, съдържащ идентификаторите на нововмъкнати записи. Ниво на ред след тригера за вмъкване ще добави нов идентификатор към списъка. Съдържанието на тази променлива на пакета ще бъде различно за всяка различна сесия, така че нека наречем тази променлива
session_variable
. - Ниво на ред след задействане на вмъкване, което ще добави нов идентификатор към
session_variable
. - Ниво на таблица след задействане на вмъкване, което ще получи идентификатори от
session_variable
, обработете идентификатора и след това го премахнете отsession_variable
. Този тригер може да изпълни необходимите селекции/актуализации на aso_quote_headers_all. След като бъде обработен нововмъкнат идентификатор, този тригер трябва да гарантира, че той ще бъде премахнат отsession_variable
.