Ich arbeite an einer großen, komplexen Anwendung vor kurzem damit begonnen, und ich habe nur einen Fehler aufgrund dieser Fehler zugewiesen wurde:ORA-04091: Tabelle [bla] mutiert, Trigger/Funktion kann nicht sehen, es
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'
Der Auslöser in Frage sieht aus wie
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;
Die Tabelle einen Primärschlüssel „t1_pk
“ hat, eine „Termin Ereignis-ID“ t1_appnt_evnt_id
und eine weitere Spalte „t1_prnt_t1_pk
“, die enthalten ein können oder nicht andere Reihe .
Es scheint der Auslöser sicher zu machen versucht, dass niemand sonst mit dem gleichen t1_appnt_evnt_id
hat
auf den gleichen verwiesen wurde diese Reihe zu
bezieht sich ein Verweis auf eine andere Zeile, wenn dieser zu einer anderen Zeile bezieht.
Der Kommentar zum Fehlerbericht von der DBA sagt "Entfernen Sie den Trigger, und führen Sie die Überprüfung in den Code", aber leider haben sie eine proprietäre Code Generation Framework über Hibernate geschichtet, so dass ich nicht einmal zu sehen heraus, wo es tatsächlich ausgeschrieben wird, also hoffe ich, dass es einen Weg gibt, diesen Auslöser zum Laufen zu bringen. Ist da?
Regeln wie diese nur im Code zu erzwingen ist eine schlechte Idee - mehrere gleichzeitige Updates sind schwer zu handhaben. Wenn Sie in Ihrem Code synchronisieren, können Sie mit schmutzigen Deadlocks zwischen diesen und Datenbanksperren enden. –
Fazit - Oracle löst saugen. Vermeide sie wie die Pest, abgesehen von so einfachen Dingen wie dem Aktualisieren von Sequenzwerten oder Feldern vom Typ "updated_by". Ihre Auslöser saugt in den 90er Jahren und sie saugen jetzt. –