Damit rekursive trigger in PostgreSQL
Wie Sie verhindern, dass rekursiven Ausführung der trigger? Sagen wir, ich will mit dem Bau einer "Baum-in der Lage" Beschreibung Diagramm der Konten. Also, was ich zu tun ist, wenn ein neuer Datensatz eingefügt/aktualisiert, update ich die den übergeordneten Datensatz ist down_qty
so würde das auslösen der update-trigger rekursiv.
Recht jetzt mein code ist ok - ich habe dies auf UPDATE
trigger der ersten Zeile:
-- prevents recursive trigger
if new.track_recursive_trigger <> old.track_recursive_trigger then
return new;
end if;
- Und das ist der Beispielcode aus meinem trigger, wenn ich zum aktualisieren der übergeordneten Datensatzes Menge:
update account_category set
track_recursive_trigger = track_recursive_trigger + 1, -- i put this line to prevent recursive trigger
down_qty = down_qty - (old.down_qty + 1)
where account_category_id = m_parent_account;
Ich denke, wenn es einen Weg gibt in PostgreSQL zu erkennen rekursive auslösen, ohne dass ein neues Feld, etwas analoges zu MSSQL ist trigger_nestlevel
.
[BEARBEITEN]
Ich Schleife innerhalb der Struktur, ich muss sprudeln die down_qty
jeder account_category
zurück zu seiner Wurzel. Ich zum Beispiel legen Sie ein neues Konto, Kategorie, braucht es zur Erhöhung des down_qty
des übergeordneten account_category
ebenso, wenn ich das Konto ändern, Kategorie Muttergesellschaft account_category
muss ich Dekrementieren down_qty
von account_category
's früheren übergeordneten account_category
. Obwohl ich denke, es kann, ich bin nicht lassen, PostgreSQL tun die rekursive trigger. Ich verwendet, MSSQL, vor denen die trigger-rekursive Tiefe Ebene ist begrenzt nur bis zu 16
Ebenen.
InformationsquelleAutor der Frage Hao | 2009-04-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
In pg, es ist bis zu Ihnen, zu überwachen, trigger-rekursionen.
http://www.postgresql.org/docs/8.3/static/trigger-definition.html
InformationsquelleAutor der Antwort tpdi
Dies ist, was ich in PostgreSQL 9.2, obwohl ich muss zugeben, dass ich nicht finde, dieser Ansatz dokumentiert. Gibt es eine Funktion
pg_trigger_depth()
hier dokumentiertdie ich verwenden, um die Unterscheidung zwischen original und geschachtelte Aufrufe in den trigger.InformationsquelleAutor der Antwort agnessa
Sich am Anfang der definition des triggers können Sie deaktivieren Sie die Trigger für die betreffende Tabelle, und reaktivieren Sie diese am Ende (und machen Sie sicher eine Ausnahme, nicht beenden Sie die Ausführung vor erwartet!). Das hat viele Tiefe Löcher, kann aber die Arbeit für einige Licht-Implementierungen. Beachten Sie, dass für diese Implementierung benötigen Sie auch Privilegien zu deaktivieren löst.
InformationsquelleAutor der Antwort diegom_ch
Zu vermeiden, die unbegrenzte Rekursion, siehe meine Antwort hier. Wie andere, die kommentiert haben, wenn Sie Ihre Daten-Struktur ist ein echter Baum (die Wurzel(N) keine übergeordnete(s)) und die Rekursion wird immer stoppen an der Wurzel(s). Für Knoten mit nur einem Elternteil Zeigerder einzige Weg für unbegrenzte Rekursion wäre, wenn es loops zu präsentieren. (die Methode in meinem link besuchen jeden Knoten bei den meisten einmal)
InformationsquelleAutor der Antwort wildplasser