Nie idź tam.
ORA-04091: table XXXX is mutating
jest ogólnie dobrym wskaźnikiem, że wszystko, co próbujesz zrobić, jest zbyt skomplikowane, aby można je było wykonać niezawodnie z wyzwalaczami.
Oczywiście, możesz użyć zmiennej tablicy pakietu i kilku wyzwalaczy ( Fuj!) aby obejść ten błąd, ale Twój kod najprawdopodobniej:
- być nie do utrzymania ze względu na swoją złożoność i nieprzewidywalny charakter wyzwalaczy
- nie reaguje dobrze w środowisku wielu użytkowników
Dlatego powinieneś ponownie przemyśleć swoje podejście, gdy napotkasz ten błąd. Radzę zbudować zestaw procedur ładnie pogrupowanych w pakiet, aby poradzić sobie z spójnością między rzędami. Odbierz wszystkie uprawnienia do bezpośredniego DML w tabeli i użyj tylko tych procedur do jej modyfikacji.
Na przykład twoja procedura aktualizacji będzie atomowa proces, który:
- uzyskaj blokadę, aby zapobiec jednoczesnej aktualizacji w tej samej grupie wierszy (na przykład zablokuj rekord pokoju w aplikacji do rezerwacji hotelowych).
- sprawdź, czy wiersz, który ma zostać wstawiony, weryfikuje całą logikę biznesową
- utwórz wszystkie odpowiednie DML
- wycofuje wszystkie swoje zmiany (i tylko zmiany -- nie całą transakcję) w przypadku błędu (łatwe z PL/SQL, po prostu zgłoś błąd).