Grundsätzlich möchten wir für jede Tabelle, die für eine UPDATE / INSERT / DELETE-Operation benachrichtigt werden soll, einen TRIGGER erstellen. Sobald dieser Trigger ausgelöst wird, führt er eine Funktion aus, die einfach eine neue Zeile (die das Ereignis codiert) an eine Protokolltabelle anfügt, die wir dann von einem externen Service abfragen.
Das ist eine ziemlich übliche Verwendung für einen Abzug.
Bevor wir mit Postgres TRIGGER (s) anfangen, möchten wir wissen, wie sie skaliert werden: Wie viele Trigger können wir in einer einzelnen Postgres-Installation erstellen?
Wenn Sie sie weiterhin erstellen, ist möglicherweise nicht mehr genügend Speicherplatz vorhanden.
Es gibt keine spezifische Grenze für Trigger.
PostgreSQL-Limits sind auf der About-Seite dokumentiert .
Beeinträchtigen sie die Abfrageleistung?
Dies hängt vom Triggertyp, der Triggersprache und der Funktion des Triggers ab.
Ein einfacher PL / PgSQL- BEFORE ... FOR EACH STATEMENT
Trigger, der nichts tut, hat einen Overhead nahe Null.
FOR EACH ROW
Trigger haben einen höheren Overhead als FOR EACH STATEMENT
Trigger. Die Skalierung mit den betroffenen Zeilenzahlen ist offensichtlich.
AFTER
Trigger sind teurer als BEFORE
Trigger, da sie in die Warteschlange gestellt werden müssen, bis die Anweisung ihre Arbeit beendet und dann ausgeführt wird. Sie werden nicht auf die Festplatte verschüttet, wenn die Warteschlange groß wird (zumindest in 9.4 und darunter, kann sich in Zukunft ändern), sodass große AFTER
Triggerwarteschlangen zu einem Überlauf des verfügbaren Speichers führen können, was zum Abbruch der Anweisung führt.
Ein Trigger, der die NEW
Zeile vor dem Einfügen / Aktualisieren ändert, ist billiger als ein Trigger, der DML ausführt.
Der von Ihnen gewünschte Anwendungsfall FOR EACH STATEMENT
bietet eine bessere Leistung mit einer in Bearbeitung befindlichen Verbesserung, die es in PostgreSQL 9.5 schaffen könnte (wenn wir Glück haben), wo Trigger virtuelle OLD
und NEW
Tabellen sehen können. Dies ist in aktuellen PostgreSQL-Versionen nicht möglich, daher müssen Sie FOR EACH ROW
stattdessen Trigger verwenden.
Hat das schon mal jemand versucht?
Natürlich. Es ist eine ziemlich übliche Verwendung für Trigger, zusammen mit Auditing, Sanity Checking usw.
Sie werden in aussehen soll LISTEN
und NOTIFY
für eine gute Möglichkeit , Ihre Arbeitskraft , wenn Änderungen an der Aufgabentabelle aufzuwachen passieren.
Sie tun bereits das Wichtigste, indem Sie vermeiden, über Trigger direkt mit externen Systemen zu kommunizieren. Dies ist in Bezug auf Leistung und Zuverlässigkeit in der Regel problematisch. Oft wird versucht, E-Mails direkt von einem Auslöser aus zu senden, und das sind schlechte Nachrichten.