Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Przerwij operację wstawiania/aktualizowania w wyzwalaczu przy użyciu PL/SQL

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:

  1. uzyskaj blokadę, aby zapobiec jednoczesnej aktualizacji w tej samej grupie wierszy (na przykład zablokuj rekord pokoju w aplikacji do rezerwacji hotelowych).
  2. sprawdź, czy wiersz, który ma zostać wstawiony, weryfikuje całą logikę biznesową
  3. utwórz wszystkie odpowiednie DML
  4. wycofuje wszystkie swoje zmiany (i tylko zmiany -- nie całą transakcję) w przypadku błędu (łatwe z PL/SQL, po prostu zgłoś błąd).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Prosimy o pomoc w zapobieganiu refaktoryzacji warstwy danych tego kodu i transakcji ODP.NET

  2. połączone miesiącami

  3. Podstępny numer GROUP BY na ORACLE

  4. Zwracanie kursora z procedury wewnętrznej do procedury zewnętrznej w oracle pl/sql

  5. funkcja pl/sql wywoływana ile razy?