Oracle
 sql >> Datenbank >  >> RDS >> Oracle

So vermeiden Sie den ORA-04091-Fehler innerhalb eines Triggers

Sie könnten den Trigger auf A etwas tun lassen, um den Trigger auf B darauf aufmerksam zu machen, dass er nicht ausgelöst werden muss. Es gibt verschiedene Anforderungen, um einen Zustand für eine Sitzung einzurichten. Der einfachste mögliche Ansatz wäre, so etwas wie das Erstellen eines Pakets mit einer booleschen Variablen bypass_checks_on_b zu tun die Sie auf TRUE gesetzt haben bevor Sie das UPDATE durchführen auf A auf FALSE setzen einmal das UPDATE abgeschlossen ist, und überprüfen Sie dann den Status dieser Variablen in Ihrem Trigger auf B, bevor Sie Ihre Validierungen durchführen. Sie könnten etwas Ähnliches auch mit einer temporären Tabelle oder einem Kontext tun, anstatt ein Paket zu verwenden. Weniger effizient könnten Sie möglicherweise den Aufrufstapel in Ihrem Trigger auf B parsen, um zu sehen, ob sich der Auslöser auf A im Aufrufstapel befindet, aber das wäre ziemlich hässlich.

Ich wäre jedoch sehr vorsichtig mit dieser ganzen Architektur. Wenn Sie feststellen, dass Sie Trigger auf A haben, die Trigger auf B auslösen, die A abfragen möchten, ist es fast immer so, dass Sie viel zu viel Logik in Trigger gesteckt haben und dass Sie viel besser bedient wären, wenn Sie sich bewegen würden diese Logik in eine Ebene gespeicherter Prozeduren, die aufgerufen werden kann, anstatt dass die Anwendungen direkte Einfügungen oder Aktualisierungen vornehmen. Wenn Sie zu viel Logik in Trigger stecken, erhalten Sie am Ende ein System, das sehr schwer zu verstehen ist, weil es aus dem Anwendungscode nicht ersichtlich ist, welche Nebeneffekte verschiedene Anweisungen haben. Und Sie erhalten am Ende einen sehr zustandsbehafteten Code, bei dem Sie je nach Aufrufer viele Pfade durch ein einzelnes Stück Code haben. Das bedeutet mit ziemlicher Sicherheit, dass es Zustände geben wird, die Sie nicht testen oder an die Sie nicht denken, wo Sie entdecken werden, dass Ihr Code etwas Unerwartetes tut. Zwischen einer Menge Status und einer Codebasis mit einer Menge Nebeneffekten können Sie sehr schnell eine Codebasis aufbauen, die im Wesentlichen nicht wartbar ist.