Próbuję utowrzyć trigger, który przed usunięciem rekordu z tabeli użytkownicy, usunie najpierw rekordy
z innych tabel, które korzystają z id_uzytkownika, którego chcę usunąć, jako klucz obcy. Lecz zanim
dojdzie do usunięcie rekordów, dane które mają zostać usunięte chce przenieść do tabel, które będą
o tym pamiętały :)
Mój trigger wygląda następująco (myślę, że nie muszę przedstawiać struktur tabel, na pewno wszystko niezależnie napisane działa poprawnie):
CREATE OR REPLACE TRIGGER usuniecie_uzyt_trig before DELETE ON uzytkownicy FOR each row begin INSERT INTO test3 (id_uzytkownik, id_osoba, login, haslo, id_uprawnienie, komentarz, data_dodania) SELECT * FROM uzytkownicy WHERE id_uzytkownik = :old.id_uzytkownik; INSERT INTO test2 (id_przebieg, id_uzytkownik, DATA, komentarz, id_akcja, id_blad) SELECT * FROM przebiegi WHERE id_blad IN (SELECT id_blad FROM bledy WHERE id_uzytkownik = :old.id_uzytkownik); INSERT INTO test (id_blad, id_uzytkownik, technologia, data_zgloszenia, data_zamkniecia, opis, id_pracownik, id_przypisanego, id_rodzaj, id_poziom, id_status) SELECT * FROM bledy WHERE id_uzytkownik = :old.id_uzytkownik; DELETE FROM przebiegi WHERE id_blad IN (SELECT id_blad FROM bledy WHERE id_uzytkownik = :old.id_uzytkownik); DELETE FROM bledy WHERE id_uzytkownik = :old.id_uzytkownik; end;
Błąd:
ORA-04088: error during execution of trigger 'PROJEKT.USUNIECIE_UZYT_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.
Kiedy stworzyłem procedurę, która ma ciało tego triggera, to działała poprawnie, tylko oczywiście za parametr przyjmowała id_uzytkownika, którego chciałem usunąć lecz jego nie usuwała.
No ale zależy mi, żeby to był trigger...
Proszę o sugestie lub wyjaśnienie problemu.
Pozdrawiam!