Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment désactiver une contrainte CHECK dans SQL Server (exemples T-SQL)

Lorsque vous essayez d'entrer des données dans une table qui a un CHECK entièrement activé contrainte, vous ne réussirez que si les données ne violent pas cette contrainte. Si vous tentez de saisir des données non valides, l'opération échouera avec une erreur.

Mais que se passe-t-il si vous vous trouvez dans une situation où vous devez vraiment insérer des données qui violeront le CHECK contrainte? Peut-être que la contrainte ne s'applique plus, ou peut-être avez-vous une exception où une ligne est autorisée à contourner la contrainte. Dans tous les cas, vous ne pourrez rien saisir en dehors des règles de la contrainte.

Si vous vous trouvez dans cette situation, vous pouvez toujours désactiver la contrainte. Voici comment procéder avec Transact-SQL.

Exemple 1 - Désactiver la contrainte CHECK

Pour désactiver un CHECK contrainte, utilisez le NOCHECK argument dans un ALTER TABLE déclaration.

Comme ceci :

ALTER TABLE Occupation  
NOCHECK CONSTRAINT chkJobTitle; 

Ce code désactive une contrainte appelée chkJobTitle .

Exemple 2 - Examiner la contrainte CHECK

Nous pouvons interroger le sys.check_constraints vue système pour vérifier que notre contrainte a bien été désactivée :

SELECT 
  name,
  is_disabled,
  is_not_trusted,
  definition
FROM sys.check_constraints;

Résultat :

+-----------------+---------------+------------------+----------------------------------------+
| name            | is_disabled   | is_not_trusted   | definition                             |
|-----------------+---------------+------------------+----------------------------------------|
| chkPrice        | 0             | 0                | ([Price]>(0))                          |
| chkValidEndDate | 0             | 0                | ([EndDate]>=[StartDate])               |
| chkTeamSize     | 0             | 0                | ([TeamSize]>=(5) AND [TeamSize]<=(20)) |
| chkJobTitle     | 1             | 1                | ([JobTitle]<>'Digital Nomad')          |
+-----------------+---------------+------------------+----------------------------------------+

Dans ce cas, j'ai sélectionné tous les CHECK contraintes de la base de données actuelle.

Nous pouvons voir que c'est le seul qui est désactivé (parce que son is_disabled la colonne est définie sur 1 ).

Vous remarquerez peut-être que le is_not_trusted la colonne est également définie sur 1 . Cela indique que le CHECK contrainte n'a pas été vérifiée par le système pour toutes les lignes.

Autrement dit, on ne peut plus supposer que la contrainte a vérifié toutes les données. Le fait que la contrainte soit désactivée signifie que les données peuvent désormais entrer dans la base de données sans être vérifiées par la contrainte. Par conséquent, il est possible que des données non valides soient présentes dans la base de données.

Si jamais vous avez besoin de réactiver le CHECK contrainte, vous aurez la possibilité de restaurer la confiance de la contrainte (en utilisant la commande WITH CHECK option). Cela vérifiera toutes les lignes existantes avant d'activer la contrainte.

Vous aurez également la possibilité de ne pas vérifier les données existantes, mais cela ne devrait être fait que dans de rares cas.

Consultez Ce que vous devez savoir sur WITH NOCHECK lors de l'activation d'une contrainte CHECK dans SQL Server pour une démonstration de la façon dont la confiance est affectée, selon la façon dont vous réactivez la contrainte.