Ist es möglich, dynamisch-Schleife durch eine Tabelle Spalten?
Ich habe eine trigger-Funktion für eine Tabelle test mit folgenden code-snippet:
IF TG_OP='UPDATE' THEN
IF OLD.locked > 0 AND
( OLD.org_id <> NEW.org_id OR
OLD.document_code <> NEW.document_code OR
-- other columns ...
)
THEN
RAISE EXCEPTION 'Message';
-- more code
So, ich bin statisch überprüfung der für die Spalte neuer Wert mit den vorherigen Wert zur Gewährleistung der Integrität. Jetzt jedes mal, wenn meine business-Logik verpasst und ich habe das hinzufügen von neuen Spalten in die Tabelle, ich werde mich ändern müssen, um diese trigger zu jeder Zeit. Ich dachte, es wäre besser, wenn ich irgendwie könnte, dynamisch, überprüfen Sie alle Spalten der Tabelle, ohne explizit indem Sie Ihre Namen.
Wie kann es getan werden?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Werfen Sie einen Blick auf die information_schema-gibt es eine Ansicht "Spalten". Ausführen einer Abfrage, um alle aktuellen columnnames aus der Tabelle, die den trigger ausgelöst hat:
Schleife über das Ergebnis und dort gehen Sie!
Mehr Informationen finden Sie in der Handbuch.
Ab 9.0 beta2-Dokumentation über die
WHEN
Klausel in Triggern, die möglicherweise verwendet werden, die in früheren Versionen innerhalb des trigger-Körper:OLD.* IS DISTINCT FROM NEW.*
oder möglicherweise (von 8.2 release notes)
IF row(new.*) IS DISTINCT FROM row(old.*)
Locked > 0
und oblocked
geändert hat. ZusätzlichIS DISTINCT FROM
Angebote mit null-Werte in eine weniger überraschende Weise als<>
Iteration über DATENSATZ-variable im trigger
Verwenden, pl/perl und pl/python. Sie sind viel besser geeignet für solche Aufgaben. viel besser.
Können Sie auch installieren hstore-new, und verwenden Sie die Zeile->hstore Semantik, aber das ist definitiv nicht eine gute Idee, wenn Sie mit normalen Datentypen.
In Postgres 9.0 oder später hinzufügen eines
Klausel, um Ihre trigger-definition (
CREATE TRIGGER
- Anweisung):Nur möglich, wenn der Trigger
BEFORE
/AFTER
UPDATE
, wo beideOLD
undNEW
definiert sind. Sie würde eine Ausnahme ausgelöst werden, versuchen dieseWHEN
Klausel mitINSERT
oderDELETE
löst.Radikal vereinfachen, die trigger Funktion entsprechend:
Kein Bedarf zu testen
IF TG_OP='UPDATE' ...
da dieser trigger funktioniert nur fürUPDATE
sowieso.Oder verschieben, dass die Bedingung in der WENN-Klausel, zu:
So dass nur eine bedingungslose
RAISE EXCEPTION
in Ihrer trigger-Funktion, die nur aufgerufen wird, wenn erforderlich, um mit zu beginnen.Lesen Sie das Kleingedruckte:
Verwandte:
Auch die Frage klären, Titel
Ja. Beispiele: