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

Comment désactiver toutes les contraintes de vérification et de clé étrangère dans une base de données dans SQL Server (exemples T-SQL)

Vous pouvez utiliser le code ci-dessous pour désactiver tous les CHECK et contraintes de clé étrangère pour la base de données actuelle dans SQL Server.

EXEC sp_MSforeachtable @command1="ALTER TABLE ? NOCHECK CONSTRAINT ALL"

Ceci utilise le sp_MSforeachtable non documenté de Microsoft procédure stockée. Cette procédure vous permet d'effectuer des tâches sur chaque table d'une base de données. C'est donc parfait pour notre tâche ici - pour désactiver tous les CHECK contraintes dans la base de données actuelle.

Vous trouverez ci-dessous un exemple où je fais cela, puis je vérifie le résultat.

Exemple 1 - Examiner les contraintes

Tout d'abord, je vais jeter un coup d'œil au CHECK actuel et les contraintes de clé étrangère dans la base de données, pour voir si elles sont activées ou désactivées.

SELECT
  OBJECT_NAME(parent_object_id) AS 'Table',
  name AS 'Constraint',
  is_disabled, 
  is_not_trusted
FROM sys.foreign_keys
UNION
SELECT 
  OBJECT_NAME(parent_object_id),
  name,
  is_disabled, 
  is_not_trusted
FROM sys.check_constraints;

Résultat :

+----------------+-----------------+---------------+------------------+
| Table          | Constraint      | is_disabled   | is_not_trusted   |
|----------------+-----------------+---------------+------------------|
| ConstraintTest | chkPrice        | 0             | 0                |
| ConstraintTest | chkValidEndDate | 0             | 0                |
| ConstraintTest | chkTeamSize     | 0             | 0                |
| Occupation     | chkJobTitle     | 0             | 0                |
+----------------+-----------------+---------------+------------------+

Il y a donc actuellement quatre CHECK contraintes dans la base de données, pour deux tables différentes.

Nous pouvons voir que toutes les contraintes sont activées car is_disabled est défini sur 0 .

Exemple 2 - Désactiver les contraintes

Maintenant, je vais désactiver toutes les contraintes :

EXEC sp_MSforeachtable @command1="ALTER TABLE ? NOCHECK CONSTRAINT ALL"

C'est généralement une bonne idée de s'assurer que vous utilisez la bonne base de données lorsque vous faites ce genre de choses. Nous pourrions donc ajouter au code ci-dessus en basculant explicitement vers la bonne base de données :

USE Test;
EXEC sp_MSforeachtable @command1="ALTER TABLE ? NOCHECK CONSTRAINT ALL"

Dans ce cas, je passe à une base de données appelée Test .

Exemple 3 - Vérifier le résultat

Après avoir exécuté le code ci-dessus, je vais maintenant exécuter la même requête du premier exemple pour voir le résultat.

SELECT
  OBJECT_NAME(parent_object_id) AS 'Table',
  name AS 'Constraint',
  is_disabled, 
  is_not_trusted
FROM sys.foreign_keys
UNION
SELECT 
  OBJECT_NAME(parent_object_id),
  name,
  is_disabled, 
  is_not_trusted
FROM sys.check_constraints;

Résultat :

+----------------+-----------------+---------------+------------------+
| Table          | Constraint      | is_disabled   | is_not_trusted   |
|----------------+-----------------+---------------+------------------|
| ConstraintTest | chkPrice        | 1             | 1                |
| ConstraintTest | chkValidEndDate | 1             | 1                |
| ConstraintTest | chkTeamSize     | 1             | 1                |
| Occupation     | chkJobTitle     | 1             | 1                |
+----------------+-----------------+---------------+------------------+

Ainsi, toutes les contraintes de la base de données ont été désactivées (parce que is_disabled la colonne est définie sur 1 pour ces contraintes).

Notez que le is_not_trusted la colonne est également définie sur 1 . Il s'agit d'une considération importante, surtout si vous avez l'intention de réactiver l'une de vos contraintes désactivées.

Consultez Ce que vous devez savoir sur WITH NOCHECK lors de l'activation d'une contrainte CHECK dans SQL Server pour plus d'informations sur la restauration de la confiance lors de la réactivation de vos contraintes. Les informations contenues dans cet article s'appliquent également aux clés étrangères.

Désactiver les contraintes individuellement

Si vous souhaitez uniquement désactiver les contraintes une par une, consultez Comment désactiver une contrainte CHECK dans SQL Server pour des exemples.