Wie kann man innerhalb einer Triggerfunktion herausfinden, welche Felder aktualisiert werden?
Ist das möglich? Ich bin daran interessiert, herauszufinden, welche Spalten angegeben wurden, in der UPDATE
Anfrage, unabhängig von der Tatsache, dass der neue Wert gesendet wird, der kann oder nicht sein kann, was gespeichert ist in der Datenbank bereits.
Der Grund, warum ich dies tun wollen ist, weil wir haben eine Tabelle, die updates erhalten können aus mehreren Quellen. Vorher waren wir nicht zu erfassen, welche Quelle das update stammt. Nun speichert die Tabelle die Quelle durchgeführt hat das neueste update. Wir können einige der Quellen senden eine Kennung, aber das ist keine option für alles. Also ich möchte in der Lage zu erkennen, Wann ein UPDATE
Anfrage nicht über eine id, so kann ich Ersatz in einem default-Wert.
InformationsquelleAutor der Frage EvilAmarant7x | 2012-01-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie @A. H. schreibt in seinem Kommentar, wenn eine "Quelle" nicht "senden Sie einen Bezeichner", die Spalte bleibt unverändert. Dann kann man nicht erkennen, ob das aktuelle UPDATE wurde von der gleichen Quelle wie die Letzte, oder von einer Quelle, die nicht die Spalte an alle. In anderen Worten: das funktioniert nicht richtig.
Wenn die "Quelle" ist erkennbar durch irgendwelche diese session-Informationen FunktionenSie konnte arbeiten. Wie:
Unbedingt für jedes update.
Allgemeine Lösung
Fand ich einen Weg, wie löst man das ursprüngliche problem. Die Spalte einen Standardwert in alle update, wo die Spalte ist nicht aktualisiert (nicht in der
SET
Liste derUPDATE
).Zentrales element ist ein pro-Trigger eingeführt in PostgreSQL 9.0:
Das ist die einzige einfache Möglichkeit, die ich gefunden, zu unterscheiden, ob eine Spalte wurde mit einem neuen Wert aktualisiert identisch mit dem alten Wert im Vergleich zu nicht aktualisiert.
Ein könnte Parsen der zurückgegebenen text von
current_query()
.Ich nehme an, eine Spalte
col
definiertNOT NULL
.col
zuNULL
wenn unverändert:Implementieren von Triggern, step2 ist ein pro-Trigger:
Den Namen der Trigger, die relevant sind, denn Sie werden entlassen in alphabetischer Reihenfolge!
Das Verfahren könnte vereinfacht werden, wenn wir so etwas wie "pro-nicht-Trigger" oder einen anderen Weg, um einfach überprüfen Sie die Ziel-Liste ein
UPDATE
in einem trigger.Wenn Ihre Spalte
NULL
haben, verwenden Sie einen anderen "unmöglich" ist-temp. Wert und prüfen Sie dieNULL
zusätzlich:InformationsquelleAutor der Antwort Erwin Brandstetter
In plpgsql, Sie könnten etwas tun, wie dies in Ihrer trigger-Funktion:
InformationsquelleAutor der Antwort Frank Heikens
Habe ich erhalten, eine andere Lösung zu ähnlichen problem fast natürlich, weil meine Tabelle, die eine Spalte mit der Semantik von "last-update-Zeitstempel" (nennen wir es UPDT).
So, ich entschieden, um neue Werte von Quelle und UPDT in jedem update nur auf einmal (oder gar keine). Da UPDT soll ändern bei jedem update, mit einer solchen Politik kann man verwenden, Bedingung
new.UPDT = old.UPDT
zu folgern, dass keine Quelle angegeben wurde, mit aktuellen update und ersetzen Sie die Standard-Einstellung.Wenn man bereits letztes update timestamp' - Spalte in seiner Tabelle, diese Lösung wird einfacher sein, als die Schaffung von drei Triggern. Nicht sicher, ob es eine bessere Idee, UPDT, wenn es nicht benötigt wird, schon. Wenn updates sind so Häufig, dass es Gefahr, timestamp ähnlichkeit, ein Sequenzer kann verwendet werden, anstelle von timestamp.
InformationsquelleAutor der Antwort mas.morozov