SET CONSTRAINTS

Nom

SET CONSTRAINTS -- initialise le mode de vérification de contrainte de la transaction en cours

Synopsis

SET CONSTRAINTS { ALL | nom [, ...] } { DEFERRED | IMMEDIATE }

Description

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 donnée une des trois caractéristiques : DEFERRABLE INITIALLY DEFERRED, DEFERRABLE INITIALLY IMMEDIATE ou NOT DEFERRABLE. La troisième classe 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). S'il existe plusieurs contraintes correspondant à un nom donné, elles sont toutes affectées. SET CONSTRAINTS ALL modifie le mode de toutes les contraintes diffé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 de clés étrangères sont affectées par ce paramétrage. Les contraintes de vérification et les contraintes uniques sont toujours immédiates.

Notes

Cette commande altère seulement le comportement des contraintes à l'intérieur de la transaction en cours. Du coup, si vous exécutez cette commande en dehors d'un bloc de transaction (pair BEGIN/COMMIT), elle ne semble pas avoir d'effet.

Compatibilité

Cette commande est compatible avec le comportement défini par le standard SQL à part le fait que dans PostgreSQL, elle ne s'applique qu'aux contraintes de clés étrangères.

Le standard SQL indique que les noms de contraintes apparaissant dans SET CONSTRAINTS peut être qualifiés avec le nom du schéma. Ceci n'est pas encore supporté par PostgreSQL : les noms ne doivent pas être qualifiés et toutes les contraintes correspondant à la commande sont affectées quelque soit le schéma où elles se trouvent.