sql >> Databasteknik >  >> RDS >> Oracle

ORACLE Efter uppdateringstrigger:löser ORA-04091 mutationstabellfel

"Finns det något sätt att undvika mutationstabellfelet utan att använda en tillfällig tabell för värden eller en autonom transaktion?"

tl;dr nej.

Det muterande tabellfelet orsakas av att man frågar tabellen som äger utlösaren, eller tabeller som är involverade i en främmande nyckelrelation med den ägande tabellen (åtminstone i äldre versioner av databasen, osäker på om den fortfarande finns).

I en korrekt designad applikation bör detta inte vara nödvändigt. Det är därför många människor ser muterande tabeller som en indikator på dålig datamodellering. Till exempel är mutation ofta förknippad med otillräcklig normalisering.

För att parafrasera Jamie Zawinski:Vissa människor, när de konfronteras med ett muterande tabellundantag, tänker "jag vet, jag kommer att använda autonoma transaktioner." Nu har de två problem.

Ibland kan felet undvikas genom att helt enkelt modifiera :NEW-värdena i en BEFORE INSERT ELLER UPDATE-utlösare eller genom att använda virtuella kolumner. Men du måste lägga upp mer information för att se om dessa gäller.

Men den bästa lösningen är att inte behöva någon annan typ.




  1. SQL SERVER – Ett knep för att hantera dynamisk SQL för att undvika SQL Injection Attack?

  2. UPPER() – Konvertera till versaler i PostgreSQL

  3. Integrera Firebase med PHP för realtidskommunikation

  4. Hur YEARWEEK() fungerar i MariaDB