Недавно я начал работать над большим сложным приложением, и мне только что была назначена ошибка из-за этой ошибки:
ORA-04091: table SCMA.TBL1 is mutating, trigger/function may not see it
ORA-06512: at "SCMA.TRG_T1_TBL1_COL1", line 4
ORA-04088: error during execution of trigger 'SCMA.TRG_T1_TBL1_COL1'
Рассматриваемый триггер выглядит так
create or replace TRIGGER TRG_T1_TBL1_COL1
BEFORE INSERT OR UPDATE OF t1_appnt_evnt_id ON TBL1
FOR EACH ROW
WHEN (NEW.t1_prnt_t1_pk is not null)
DECLARE
v_reassign_count number(20);
BEGIN
select count(t1_pk) INTO v_reassign_count from TBL1
where t1_appnt_evnt_id=:new.t1_appnt_evnt_id and t1_prnt_t1_pk is not null;
IF (v_reassign_count > 0) THEN
RAISE_APPLICATION_ERROR(-20013, 'Multiple reassignments not allowed');
END IF;
END;
В таблице есть первичный ключ "t1_pk
", "идентификатор события встречи" t1_appnt_evnt_id
и еще один столбец "t1_prnt_t1_pk
", который может содержать или не содержать t1_pk
другой строки.
Похоже, что триггер пытается убедиться, что никто другой с тем же t1_appnt_evnt_id
не ссылается на тот же самый, на который ссылается эта строка, ссылку на другую строку, если этот ссылается на другую строку.
В комментарии к отчету об ошибке от администратора базы данных говорится: «Удалите триггер и выполните проверку в коде», но, к сожалению, у них есть проприетарная среда генерации кода, наложенная поверх Hibernate, поэтому я даже не могу понять, где она на самом деле записывается, поэтому я надеюсь, что есть способ заставить этот триггер работать. Здесь?