Ja, es ist immer schlecht, Verhalten abhängig zu machen pg_trigger_depth()
Vielleicht bin ich pauschalen Aussagen etwas weniger abgeneigt, aber was könnte es nützen? Es gibt kein Argument dafür, warum Sie eine solche Funktion wünschen würden. Der Hauptzweck einer Datenbank besteht darin, die Datenintegrität sicherzustellen. Und soweit ich sehen kann und mich möglicherweise irre, ist eine solche Verwendung immer eine potenzielle Verletzung der Datenintegrität. In @ Erwins Antwort sagt er "wenn du es vergisst" . Der Zweck der Gewährleistung der Integrität besteht darin, diese Möglichkeit auszuschließen. Wenn sich ein Agent an alles erinnern und die Konsequenzen und den Code um ihn herum verstehen kann, können Sie die Datenintegrität aus allem herausholen .
Lassen Sie uns ein paar Begriffe in die Programmierung einführen, die wir haben
- "state", der alles enthält , auf das ein Programmierer Zugriff hat.
- "Ausführungskontext", der die Ausführungsumgebung enthält.
Wir haben weiterhin einen Begriff für eine Funktion, die keinen Zustand hat, den wir als reine Funktion bezeichnen .
Die Funktion wertet immer den gleichen Ergebniswert bei gleichen Argumentwerten aus. Der Funktionsergebniswert kann weder von versteckten Informationen oder Zuständen abhängen, die sich während der Programmausführung oder zwischen verschiedenen Programmausführungen ändern können, noch von externen Eingaben von E / A-Geräten (normalerweise - siehe unten).
Die Unterscheidung nach Reinheit ist nützlich, da sie die Belastung beseitigt, sich im Namen des Computers oder des Programmierers an etwas zu erinnern: f(x) = y
ist immer wahr. Hier verletzen Sie die Reinheit am schlimmsten Ort - der Datenbank. Und Sie tun dies auf eine komplexe und fehleranfällige Weise, sodass der interne Ausführungskontext im Status Ihrer DB-Anwendung greifbar wird.
Das würde ich nicht wollen. Denken Sie nur an die Komplexität, die Sie mental abpuffern müssen.
Table A
's Trigger A
Feuer
Trigger A
gibt immer DML aus Table B
, feuert Trigger B
.
Trigger B
Bedingt DML ausgeben Table A
, feuern Trigger A
.
Trigger B
gibt immer DML aus Table A
, feuert Trigger A
.
Trigger A
Bedingt DML ausgeben Table B
, feuern Trigger B
.
Trigger B
Bedingt DML ausgeben Table A
, feuern Trigger A
.
Trigger B
gibt immer DML aus Table A
, feuert Trigger A
.
Wenn das komplex aussieht, denken Sie daran, dass "bedingt" weiter erweitert werden kann auf "es ist passiert, aber es kann nicht immer passieren" und "es ist nicht passiert, aber es kann woanders passieren".
Um pg_trigger_depth()
überhaupt nützlich zu sein, müssen Sie eine Reihe von Ereignissen haben, die ähnlich komplex sind. Und jetzt möchten Sie, dass die Ausführung vom Ausführungsinhalt in dieser Kette abhängt?
Ich würde das vermeiden. Wenn Ihr Auslösesystem so komplex ist, spielen Sie allein mit einer Handgranate in einem Schrank heiße Kartoffeln und es scheint nicht gut zu enden.