sql >> Database >  >> RDS >> Oracle

Invoegen/bijwerken in trigger afbreken met PL/SQL

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:

  1. verkrijg een vergrendeling om gelijktijdige updates op dezelfde groep rijen te voorkomen (vergrendel bijvoorbeeld de kamerrecord in een hotelreserveringstoepassing).
  2. controleer of de in te voegen rij alle bedrijfslogica valideert
  3. maak alle relevante DML
  4. 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).



  1. SQL orakel beginnersvragen

  2. Zoek naar vergelijkbare woorden met behulp van een index

  3. MYSQLI::prepare() , fout bij gebruik tijdelijke aanduiding :iets

  4. Implementeer SQL Server AlwaysOn-beschikbaarheidsgroepen op Linux