Как уже указывалось, это ужасная идея / дизайн.Триггеры - очень плохие методы для обеспечения соблюдения бизнес-правил.Они должны применяться в приложении или лучше (IMO) с помощью хранимой процедуры, вызываемой приложением.В этом случае это не только плохая идея, но и не может быть реализовано по желанию.Внутри триггера Oracle не разрешает доступ к таблице, по которой сработал триггер.Это то, что указывает на мутирование.Подумайте о попытке отладить это или решить проблему неделю спустя.Тем не менее, это бессмысленное может быть достигнуто путем создания представления и обработки вместо него вместо таблицы.
-- setup
create table showing (exhibit_id integer, exhibit_name varchar2(50));
create view show as select * from showing;
-- trigger on VIEW
create or replace trigger show_iiur
instead of insert or update on show
for each row
begin
merge into showing
using (select :new.exhibit_id new_eid
, :old.exhibit_id old_eid
, :new.exhibit_name new_ename
from dual
) on (exhibit_id = old_eid)
when matched then
update set exhibit_name = new_ename
delete where new_eid is null
when not matched then
insert (exhibit_id, exhibit_name)
values (:new.exhibit_id, :new.exhibit_name);
end ;
-- test data
insert into show(exhibit_id, exhibit_name)
select 1,'abc' from dual union all
select 2,'def' from dual union all
select 3,'ghi' from dual;
-- 3 rows inserted
select * from show;
--- test
update show
set exhibit_name = 'XyZ'
where exhibit_id = 3;
-- 1 row updated
-- Now for the requested action. Turn the UPDATE into a DELETE
update show
set exhibit_id = null
where exhibit_name = 'def';
-- 1 row updated
select * from show;
-- table and view are the same (expect o rows)
select * from show MINUS select * from showing
UNION ALL
select * from showing MINUS select * from show;
Опять же, это плохой вариант, но вы можете это сделать.Но только потому, что вы можете, не значит, что вы должны.Или что вы будете довольны результатом.Удачи.