Ga daar niet heen.
ORA-04091: table XXXX is mutating
is over het algemeen een goede indicatie dat wat u ook probeert te doen, te complex is om betrouwbaar te doen met triggers.
Natuurlijk kun je een pakketarrayvariabele en een handvol triggers gebruiken ( ugh!) om deze fout te omzeilen, maar uw code zal hoogstwaarschijnlijk:
- onhoudbaar zijn vanwege de complexiteit en de onvoorspelbare aard van triggers
- reageert niet goed op een omgeving met meerdere gebruikers
Dit is de reden waarom u uw aanpak moet heroverwegen wanneer u deze fout tegenkomt. Ik raad je aan om een set procedures te bouwen die mooi gegroepeerd zijn in een pakket om de consistentie tussen rijen aan te pakken. Trek alle rechten in om de tabel rechtstreeks te DMLen en gebruik alleen die procedures om deze te wijzigen.
Uw updateprocedure zou bijvoorbeeld een atomaire . zijn proces dat zou:
- verkrijg een vergrendeling om gelijktijdige updates op dezelfde groep rijen te voorkomen (vergrendel bijvoorbeeld de kamerrecord in een hotelreserveringstoepassing).
- controleer of de in te voegen rij alle bedrijfslogica valideert
- maak alle relevante DML
- rolt alle wijzigingen terug (en alleen de wijzigingen -- niet de hele transactie) in geval van een fout (eenvoudig met PL/SQL, geef gewoon een fout).