SET CONSTRAINTS — initialise le moment de vérification de contrainte de la transaction en cours
SET CONSTRAINTS { ALL | nom
[, ...] } { DEFERRED | IMMEDIATE }
SET CONSTRAINTS
initialise le comportement de la
vérification des contraintes dans la transaction en cours.
Les contraintes IMMEDIATE
sont vérifiées à la fin de
chaque instruction. Les contraintes DEFERRED
ne sont
vérifiées qu'à la validation de la transaction. Chaque contrainte a son
propre mode IMMEDIATE
ou DEFERRED
.
À la création, une contrainte se voit donner une des trois
caractéristiques : DEFERRABLE INITIALLY DEFERRED
,
DEFERRABLE INITIALLY IMMEDIATE
ou
NOT DEFERRABLE
. La troisième forme est toujours
IMMEDIATE
et n'est pas affectée par la commande
SET CONSTRAINTS
. Les deux premières classes commencent
chaque transaction dans le mode indiqué mais leur comportement peut changer à
l'intérieur d'une transaction par SET CONSTRAINTS
.
SET CONSTRAINTS
avec une liste de noms de contraintes
modifie le mode de ces contraintes (qui doivent toutes être différables).
Chaque nom de contrainte peut être qualifié d'un schéma.
Le chemin de recherche des schémas est utilisé pour trouver le premier
nom correspondant si aucun nom de schéma n'a été indiqué.
SET CONSTRAINTS ALL
modifie le mode de toutes les
contraintes déférables.
Lorsque SET CONSTRAINTS
modifie le mode d'une contrainte
de DEFERRED
à IMMEDIATE
, le nouveau
mode prend effet rétroactivement : toute modification de données qui
aurait été vérifiée à la fin de la transaction est en fait vérifiée lors de
l'exécution de la commande SET CONSTRAINTS
. Si une
contrainte est violée, la commande SET CONSTRAINTS
échoue
(et ne change pas le mode de contrainte). Du coup, SET
CONSTRAINTS
peut être utilisée pour forcer la vérification de
contraintes à un point spécifique d'une transaction.
Actuellement, seules les contraintes UNIQUE
,
PRIMARY KEY
, REFERENCES
(clé
étrangère) et EXCLUDE
sont affectées par ce paramètre.
Les contraintes NOT NULL
et CHECK
sont toujours vérifiées immédiatement quand une ligne est insérée ou
modifiée (pas à la fin de l'instruction). Les
contraintes uniques et d'exclusion qui n'ont pas été déclarées
DEFERRABLE
sont aussi vérifiées immédiatement.
Le déclenchement des triggers qui sont déclarés comme des « triggers de contraintes » est aussi contrôlé par ce paramètre -- ils se déclenchent au même moment que la contrainte associée devait être vérifiée.
Comme PostgreSQL ne nécessite pas les noms de
contraintes d'être uniques à l'intérieur d'un schéma (mais seulement par
tables), il est possible qu'il y ait plus d'une correspondance pour un
nom de contrainte spécifié. Dans ce cas, SET CONSTRAINTS
agira sur toutes les correspondances. Pour un nom sans qualification de
schéma, une fois qu'une ou plusieurs correspondances ont été trouvées dans
les schémas du chemin de recherche, les autres schémas du chemin ne sont pas
testés.
Cette commande altère seulement le comportement des contraintes à l'intérieur de la transaction en cours. Exécuter cette commande en dehors d'un bloc de transaction cause l'émission d'un message d'avertissement mais n'a pas d'autres effets.
Cette commande est compatible avec le comportement défini par le standard
SQL en dehors du fait que, dans PostgreSQL, il
ne s'applique pas aux contraintes NOT NULL
et
CHECK
. De plus, PostgreSQL
vérifie les contraintes uniques non déferrables immédiatement, pas à la
fin de l'instruction comme le standard le suggère.