Je comprends qu'un déclencheur sur la table t défini avec FOR EACH STATEMENT
sera exécuté une fois lorsque j'exécuterai un UPDATE t ...
.
Maintenant, quand t
est défini avec FOREIGN KEY ... REFERENCES a ... ON UPDATE CASCADE
, et je mets à jour N lignes a
, cela provoquera-t-il l'appel du déclencheur une fois, ou N fois?
Autrement dit, les modifications apportées à une table en cascade par une contrainte FK ressemblent-elles plus à un simple UPDATE
, ou plutôt à une série de UPDATE
s?
postgresql
trigger
foreign-key
postgresql-9.2
Hanno Fietz
la source
la source
FOR EACH STATEMENT
est orthogonale au reste de la question. Les contraintes FK sont implémentées avec des déclencheurs spéciauxFOR EACH ROW
.Réponses:
Les contraintes de clé étrangère sont actuellement implémentées avec des déclencheurs internes spéciaux. Tous sont exécutés
FOR EACH ROW
.Notez que ce sont des détails d'implémentation qui peuvent changer, alors ne vous y fiez pas. Mais les bases n'ont pas changé au cours des deux dernières versions principales, donc des changements majeurs sont peu probables.
J'ai effectué un test rapide avec une simple contrainte FK de
tbl
àtbltype
. Un FK simple est implémenté avec quatre déclencheurs internes simplesFOR EACH ROW
dans mon test à la page 9.4.Voici un bref aperçu sur la façon d'enquêter:
Deux déclencheurs "noaction" internes sont activés
tbltype
.Deux déclencheurs de «vérification» internes sont activés
tbl
.Tous sont exécutés
FOR EACH ROW
, comme indiqué par des nombres impairs danstgtype
.Les 2 octets de Postgres
tgtype smallint
représentent unint16
code source en C où le bit le moins significatif encodeTRIGGER_TYPE_ROW
. Explication détaillée ici:Vous pouvez facilement tester cela avec une paire de déclencheurs identiques où vous modifiez
FOR ROW
/STATEMENT
...la source
Il s'exécute N fois, et la façon la plus simple de voir cela est d'exécuter l'instruction avec un
EXPLAIN ANALYZE
préfixe, c'est-à-direCela vous donnera des informations similaires à ceci:
Trigger for constraint t_col_fk on a: time=1.300 calls=9
(testé avec 9.2)
la source