Ich verstehe, dass ein Trigger für die mit definierte Tabelle t FOR EACH STATEMENT
einmal ausgeführt wird, wenn ich eine ausführe UPDATE t ...
.
Wenn nun t
definiert FOREIGN KEY ... REFERENCES a ... ON UPDATE CASCADE
ist und ich N Zeilen aktualisiere a
, wird der Trigger dann einmal oder N-mal aufgerufen?
Anders ausgedrückt: Sind Änderungen an einer Tabelle, die durch eine FK-Einschränkung kaskadiert werden, eher wie eine einzelne UPDATE
oder eher wie eine Reihe von UPDATE
s?
postgresql
trigger
foreign-key
postgresql-9.2
Hanno Fietz
quelle
quelle
FOR EACH STATEMENT
wird , ist orthogonal zum Rest der Frage. FK-Einschränkungen werden mit speziellen Triggern implementiertFOR EACH ROW
.Antworten:
Fremdschlüsseleinschränkungen werden derzeit mit speziellen internen Triggern implementiert. Alle von ihnen werden ausgeführt
FOR EACH ROW
.Beachten Sie, dass dies Implementierungsdetails sind, die sich ändern können. Verlassen Sie sich also nicht darauf. Die Grundlagen haben sich in den letzten Hauptversionen jedoch nicht geändert, sodass größere Änderungen unwahrscheinlich sind.
Ich habe einen Schnelltest mit einer einfachen FK-Einschränkung von
tbl
bis durchgeführttbltype
. InFOR EACH ROW
meinem Test auf Seite 9.4 ist eine einfache FK mit vier einfachen internen Triggern implementiert .Hier ist ein kurzer Überblick über die Untersuchung:
Zwei interne "noaction" werden ausgelöst
tbltype
.Zwei interne "Check" -Trigger werden aktiviert
tbl
.Alle von ihnen werden ausgeführt
FOR EACH ROW
, wie durch ungerade Zahlen in angezeigttgtype
.Die 2 Bytes der Postgres
tgtype smallint
stellen einenint16
In-C-Quellcode dar, in dem das niedrigstwertige Bit codiertTRIGGER_TYPE_ROW
. Detaillierte Erklärung hier:Sie können dies leicht mit einem Paar identischer Trigger testen, bei denen Sie nur
FOR ROW
/STATEMENT
...quelle
Es wird N-mal ausgeführt, und der einfachste Weg, dies zu sehen, besteht darin, die Anweisung mit einem
EXPLAIN ANALYZE
vorangestellten Befehl auszuführen , d. H.Dadurch erhalten Sie ähnliche Informationen:
Trigger for constraint t_col_fk on a: time=1.300 calls=9
(getestet mit 9.2)
quelle