sql >> Databasteknik >  >> RDS >> Oracle

Hur man undviker ORA-04091-fel inom en trigger

Du kan låta avtryckaren på A göra något för att varna avtryckaren på B att den inte behöver utlösas. Det finns olika önskemål om att ställa in något tillstånd för en session. Det enklaste sättet skulle vara att göra något som att skapa ett paket med en boolesk variabel bypass_checks_on_b som du ställt in på TRUE innan du gör UPDATE på A, ställ in till FALSE en gång UPDATE slutförs och kontrollera sedan tillståndet för denna variabel i din trigger på B innan du gör dina valideringar. Du kan också göra något liknande med en tillfällig tabell eller ett sammanhang istället för att använda ett paket. Mindre effektivt kan du potentiellt analysera samtalsstacken inuti din trigger på B för att se om triggern på A finns i samtalsstacken, men det skulle tendera att vara ganska fult.

Jag skulle dock vara väldigt försiktig med hela den här arkitekturen. När du upptäcker att du har triggers på A som får triggers på B att aktiveras som skulle vilja fråga A, är det nästan alltid så att du har lagt alldeles för mycket logik i triggers och att du skulle vara mycket bättre tjänad att flytta den logiken in i ett lagrat procedurlager som kan anropas snarare än att applikationerna gör direkta insättningar eller uppdateringar. När du trycker in för mycket logik i triggers, hamnar du i ett system som är väldigt svårt att förstå eftersom det inte är uppenbart från att titta på applikationskoden vilken typ av biverkningar olika påståenden har. Och du slutar med en väldigt stateful kod där du har många vägar genom en enda kodbit beroende på vem som ringer. Det betyder nästan säkert att det kommer att finnas tillstånd som du inte testar eller inte tänker på där du kommer att upptäcka att din kod gör något oväntat. Mellan att ha massor av tillstånd och att ha en kodbas med massor av biverkningar, kan du mycket snabbt bygga en kodbas som i princip är omöjlig att underhålla.




  1. mysql concat sträng med resultat

  2. ASP.net 4.0 Entity Data Model Mysql behandlar inte Mysql Enums rätt

  3. Skicka flera fält i ett formulär (PHP)

  4. MySQL, Rails ActiveRecord datumgruppering och tidszoner