Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Trigger before delete - ORA-04088
Forum PHP.pl > Forum > Bazy danych > Oracle
llepec
Witam,
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):
  1. CREATE OR REPLACE TRIGGER usuniecie_uzyt_trig
  2. before DELETE ON uzytkownicy
  3. FOR each row
  4. begin
  5. INSERT INTO test3 (id_uzytkownik, id_osoba, login, haslo, id_uprawnienie, komentarz, data_dodania)
  6. SELECT * FROM uzytkownicy WHERE id_uzytkownik = :old.id_uzytkownik;
  7. INSERT INTO test2 (id_przebieg, id_uzytkownik, DATA, komentarz, id_akcja, id_blad)
  8. SELECT * FROM przebiegi WHERE id_blad IN (SELECT id_blad FROM bledy WHERE id_uzytkownik = :old.id_uzytkownik);
  9. INSERT INTO test (id_blad, id_uzytkownik, technologia, data_zgloszenia, data_zamkniecia, opis, id_pracownik, id_przypisanego, id_rodzaj, id_poziom, id_status)
  10. SELECT * FROM bledy WHERE id_uzytkownik = :old.id_uzytkownik;
  11. DELETE FROM przebiegi WHERE id_blad IN (SELECT id_blad FROM bledy WHERE id_uzytkownik = :old.id_uzytkownik);
  12. DELETE FROM bledy WHERE id_uzytkownik = :old.id_uzytkownik;
  13. 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!
luckyps
Poczytaj o "pragma AUTONOMOUS_TRANSACTION".

Tutaj masz przyklad triggera z uzyciem tej funkcji.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.