Próbuję napisać wyzwalacz, który po update'cie na tabeli, ponownie ją uaktualni (tj. wykona ponowny update)
tabela bledy (id_blad, id_uzytkownik, technologia, data_zgloszenia, data_zamkniecia, opis, id_pracownik, id_przypisanego, id_rodzaj, id_poziom, id_status)
Właściwie to pola tej tabeli nie muszą nas interesować. Chodzi tylko o data_zakmniecia oraz id_status.
Muszę napisać wyzwalacz, który po zmianie id_status na wartość 4, ustawi datę zamknięcia na SYSDATE.
CREATE OR REPLACE TRIGGER zakmniecie_bledu_trig AFTER UPDATE OF ID_STATUS ON BLEDY FOR EACH ROW WHEN (new.ID_STATUS = 4) BEGIN UPDATE bledy SET data_zamkniecia = SYSDATE WHERE id_blad = :new.id_blad; END;
Podczas wykonania, odpowiedniego do uruchomienia wyzwalacza, zapytania, wyskakuje następujący błąd:
SQL Error: ORA-04091: table PROJECT.BLEDY is mutating, trigger/function may not see it
ORA-06512: at "PROJECT.ZAKMNIECIE_BLEDU_TRIG", line 2
ORA-04088: error during execution of trigger 'PROJECT.ZAKMNIECIE_BLEDU_TRIG'
04091. 00000 - "table %s.%s is mutating, trigger/function may not see it"
*Cause: A trigger (or a user defined plsql function that is referenced in
this statement) attempted to look at (or modify) a table that was
in the middle of being modified by the statement which fired it.
*Action: Rewrite the trigger (or function) so it does not read that table.
Moje pytania: Czy da się w ogóle zrobić coś takiego? Jeżeli tak, prosiłbym o wskazówki. Bo treść błędu sugeruje, że niemożliwe jest wykonanie update'a na aktualnie modyfikowanej tabeli...
Pozdrawiam.