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 | +--------------------------------+------------------+---------------------+---------------+------------------+