sql >> Databasteknik >  >> RDS >> Oracle

Avbryt infogning/uppdatering i trigger med PL/SQL

Gå inte dit.

ORA-04091: table XXXX is mutating är i allmänhet en bra indikator på att vad du än försöker göra är för komplicerat för att göras pålitligt med triggers.

Visst, du kan använda en paketarrayvariabel och en handfull triggers ( usch!) för att komma runt det här felet, men din kod kommer troligen:

  • vara ohållbar på grund av dess komplexitet och den oförutsägbara karaktären hos utlösare
  • svarar inte bra på en miljö med flera användare

Det är därför du bör tänka om när du stöter på det här felet. Jag råder dig att bygga en uppsättning procedurer snyggt grupperade i ett paket för att hantera konsistens mellan raderna. Återkalla alla privilegier för att göra DML tabellen direkt och använd endast dessa procedurer för att ändra den.

Din uppdateringsprocedur skulle till exempel vara en atomär process som skulle:

  1. skaffa ett lås för att förhindra samtidiga uppdateringar på samma grupp av rader (till exempel lås rumsposten i en hotellbokningsapplikation).
  2. kontrollera att raden som ska infogas validerar all affärslogik
  3. gör all relevant DML
  4. återställer alla dess ändringar (och endast dess ändringar -- inte hela transaktionen) vid fel (enkelt med PL/SQL, bara skapa ett fel).



  1. PDO/MYSQL förberedda uttalanden som inte undkommer tecken?

  2. Hur sparar man flera repeterbara fält som array i databasen?

  3. Visual Studio 2017 + enhetsramverk + identitet + mysql fungerar inte

  4. Zend_Db:Hur ansluter man till en MySQL-databas över SSH-tunneln?