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

Comment répertorier toutes les clés étrangères avec WITH NOCHECK dans SQL Server

Ce qui suit renverra le nom des clés étrangères dans la base de données actuelle qui sont désactivées, c'est-à-dire WITH NOCHECK

Pour SQL Server 2005/2008 :

select * from sys.foreign_keys where is_disabled=1 



Il y a eu une discussion dans la réponse sur la différence entre désactivé et non approuvé.Ce qui est ci-dessous explique la différenceVoici un code pour clarifier la différence entre is_disabled et isnotrusted. (i int not null, fk int not null)create table t2(i int not null)-- créer une clé primaire sur la table t2alter t2add contrainte pk_1 clé primaire (i)-- créer une clé étrangère sur la table t1alter t1add contrainte fk_1 clé étrangère ( fk) références t2 (i)--insérer quelques enregistrementsinsérer les valeurs t2(100)insérer les valeurs t2(200)insérer les valeurs t2(300)insérer les valeurs t2(400)insérer les valeurs t2(500)insérer les valeurs t1(1 100)insérer les valeurs t1 (2 100)insérer les valeurs t1(3 500)insérer les valeurs t1(4 500)------------------------------ 1. activé et approuvéselect name,is_disabled,is_not_trusted from sys.foreign_keysGO-- 2. désactiver la table de modification des contraintes t1 NOCHECK CONSTRAINT fk_1select name,is_disabled,is_not_trusted from sys.foreign_keysGO-- 3. réactiver la contrainte, les données ne sont pas c vérifié, donc non approuvé.-- cela signifie que l'optimiseur devra toujours vérifier la table de modification de colonne t1 CHECK CONSTRAINT fk_1 select name,is_disabled,is_not_trusted from sys.foreign_keysGO--4. supprimez la contrainte de clé étrangère et rajoutez-la en vous assurant que sa contrainte est cochée-- est alors activée et approuvéetable de modification t1 DROP CONSTRAINT fk_1table de modification t1 AVEC VÉRIFICATION ajouter la contrainte fk_1 références de clé étrangère (fk) t2 (i) sélectionner le nom, is_disabled ,is_not_trusted from sys.foreign_keysGO--5. supprimez la contrainte de clé étrangère et ajoutez mais ne cochez pas - la contrainte est alors activée, mais n'est pas approuvée. .foreign_keysGO

is_disabled signifie que la contrainte est désactivée

n'est pas fiable signifie que SQL Server ne fait pas confiance à la vérification de la colonne par rapport à la table de clé étrangère.

Ainsi, on ne peut pas supposer que la réactivation de la contrainte de clé étrangère sera optimisée. Pour s'assurer que l'optimiseur fait confiance à la colonne, il est préférable de supprimer la contrainte de clé étrangère et de la recréer avec le WITH CHECK choix (4.)