sql >> Database teknologi >  >> RDS >> Oracle

Sådan undgår du ORA-04091-fejl i en trigger

Du kunne få aftrækkeren på A til at gøre noget for at advare aftrækkeren på B om, at den ikke behøver at gå i gang. Der er forskellige ønsker om at konfigurere en tilstand til en session. Den enklest mulige tilgang ville være at lave noget som at oprette en pakke med en boolesk variabel bypass_checks_on_b som du indstiller til TRUE før du foretager UPDATE på A, indstillet til FALSE en gang UPDATE fuldfører, og kontroller derefter tilstanden af ​​denne variabel i din trigger på B, før du udfører dine valideringer. Du kan også gøre noget lignende med en midlertidig tabel eller en kontekst i stedet for at bruge en pakke. Mindre effektivt kan du potentielt analysere opkaldsstakken inde i din trigger på B for at se, om triggeren på A er i opkaldsstakken, men det ville have en tendens til at være ret grimt.

Jeg ville dog være meget forsigtig med hele denne arkitektur. Når du opdager, at du har triggere på A, der får triggere på B til at udløse, som gerne vil forespørge A, er det næsten altid sådan, at du har lagt alt for meget logik i triggere, og at du ville være meget bedre tjent med at flytte den logik ind i et lagret procedurelag, der kan kaldes frem for at applikationerne laver direkte indsættelser eller opdateringer. Når du presser for meget logik ind i triggere, ender du med et system, der er meget svært at forstå, fordi det ikke er indlysende ud fra applikationskoden, hvilken slags bivirkninger forskellige udsagn har. Og du ender med en meget stateful kode, hvor du har mange veje gennem et enkelt stykke kode afhængigt af den, der ringer. Det betyder næsten helt sikkert, at der vil være tilstande, som du ikke tester eller ikke tænker på, hvor du vil opdage, at din kode gør noget uventet. Mellem at have et væld af tilstand og at have en kodebase med et væld af bivirkninger, kan du meget hurtigt bygge en kodebase, der i det væsentlige er uvedligeholdelig.




  1. Generer identitet for en Oracle-database gennem Entity Framework ved hjælp af en eksisterende lagret procedure

  2. SQL Server - Problemer med at overføre variabel til en lagret procedure

  3. Hent MySql-data og gem dem i Javascript-array

  4. Hvordan laver man en stille installation af mysql i inno setup?