Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Trigger before delete - ORA-04088
llepec
post 19.07.2013, 10:03:58
Post #1





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 3.07.2013
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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!
Go to the top of the page
+Quote Post
luckyps
post 19.07.2013, 11:29:54
Post #2





Grupa: Zarejestrowani
Postów: 153
Pomógł: 41
Dołączył: 28.06.2011
Skąd: Częstochowa

Ostrzeżenie: (0%)
-----


Poczytaj o "pragma AUTONOMOUS_TRANSACTION".

Tutaj masz przyklad triggera z uzyciem tej funkcji.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.04.2024 - 12:12