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

Comment désactiver une contrainte de clé étrangère dans SQL Server (exemples T-SQL)

Si vous vous trouvez dans une situation où vous devez désactiver une contrainte de clé étrangère dans SQL Server, voici comment procéder à l'aide de Transact-SQL.

Cela vous permettra de saisir des données sans être limité par la clé étrangère. De toute évidence, vous ne le feriez pas à moins d'avoir une très bonne raison de le faire. Les clés étrangères renforcent l'intégrité référentielle, leur désactivation peut donc créer toutes sortes de problèmes.

Exemple 1 - Désactiver la contrainte de clé étrangère

Pour désactiver une contrainte de clé étrangère, utilisez le NOCHECK argument dans un ALTER TABLE déclaration.

Comme ceci :

ALTER TABLE BandMember 
NOCHECK CONSTRAINT FK_BandMember_Musician; 

Ce code désactive une contrainte de clé étrangère appelée FK_BandMember_Musician .

Exemple 2 - Examiner la contrainte

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

SELECT 
  name AS 'Constraint',
  is_disabled,
  is_not_trusted
FROM sys.foreign_keys;

Résultat :

+--------------------------------+---------------+------------------+
| Constraint                     | is_disabled   | is_not_trusted   |
|--------------------------------+---------------+------------------|
| FK_BandMember_Band             | 0             | 0                |
| FK_BandMember_Musician         | 1             | 1                |
| FK_MembershipPeriod_BandMember | 0             | 0                |
+--------------------------------+---------------+------------------+

Dans ce cas, j'ai sélectionné toutes les contraintes de clé étrangère 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 la contrainte n'a pas été vérifiée par le système.

Cela a du sens, car nous ne pouvons 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 la contrainte, vous aurez la possibilité de restaurer la confiance de la contrainte (en utilisant le 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.

Voici à nouveau la même requête, mais avec quelques colonnes supplémentaires pour afficher les tables et les tables référencées :

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

Résultat :

+--------------------------------+------------------+---------------------+---------------+------------------+
| Constraint                     | Table            | Referenced Table    | is_disabled   | is_not_trusted   |
|--------------------------------+------------------+---------------------+---------------+------------------|
| FK_BandMember_Band             | BandMember       | Band                | 0             | 0                |
| FK_BandMember_Musician         | BandMember       | Musician            | 1             | 1                |
| FK_MembershipPeriod_BandMember | MembershipPeriod | BandMember          | 0             | 0                |
+--------------------------------+------------------+---------------------+---------------+------------------+