Pour renvoyer une liste de toutes les contraintes de clé étrangère non approuvées dans une base de données SQL Server, vous pouvez exécuter le code T-SQL ci-dessous.
Une clé étrangère non approuvée est une clé qui a son is_not_trusted
drapeau défini sur 1
.
Exemple 1 : Renvoyer uniquement les contraintes de clé étrangère non approuvées
Cette requête renvoie uniquement les contraintes de clé étrangère non approuvées dans la base de données actuelle. Pour cet exemple, je renvoie uniquement le nom de la contrainte, son statut de confiance, ainsi que son statut activé/désactivé.
SELECT name AS 'Constraint', is_not_trusted, is_disabled FROM sys.foreign_keys WHERE is_not_trusted = 1;
Résultat :
+------------------------+------------------+---------------+ | Constraint | is_not_trusted | is_disabled | |------------------------+------------------+---------------| | FK_BandMember_Band | 1 | 1 | | FK_BandMember_Musician | 1 | 0 | +------------------------+------------------+---------------+
Cela interroge le sys.foreign_keys
vue système. Nous savons qu'il ne renvoie que des contraintes non fiables car le WHERE
la clause spécifie uniquement les lignes qui ont le is_not_trusted
colonne définie sur 1
.
Si vous souhaitez renvoyer uniquement approuvé contraintes de clé étrangère, changez simplement le 1
à 0
.
J'ai également inclus le is_disabled
flag, car il nous indique si la contrainte est actuellement activée ou non. Nous pouvons voir que l'une des contraintes est activée et l'autre non.
Cela démontre le fait qu'une contrainte peut ne pas être fiable même lorsqu'elle est activée. En effet, lorsque vous activez (ou créez) une contrainte, vous avez la possibilité de lui faire vérifier toutes les données existantes avant de l'activer. Si vous choisissez de ne pas vérifier les données existantes, la contrainte restera non fiable une fois activée.
Voici à nouveau la même requête, mais cette fois j'inclus la table et la table référencée pour chaque contrainte :
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 WHERE is_not_trusted = 1;
Résultat :
+------------------------+------------+--------------------+---------------+------------------+ | Constraint | Table | Referenced Table | is_disabled | is_not_trusted | |------------------------+------------+--------------------+---------------+------------------| | FK_BandMember_Band | BandMember | Band | 1 | 1 | | FK_BandMember_Musician | BandMember | Musician | 0 | 1 | +------------------------+------------+--------------------+---------------+------------------+
Exemple 2 - Renvoyer toutes les contraintes de clé étrangère
La requête suivante renvoie tous contraintes de clé étrangère pour la base de données actuelle (pas seulement celles non approuvées) :
SELECT name AS 'Constraint', is_not_trusted, is_disabled FROM sys.foreign_keys;
Résultat :
+--------------------------------+------------------+---------------+ | Constraint | is_not_trusted | is_disabled | |--------------------------------+------------------+---------------| | FK_BandMember_Band | 1 | 1 | | FK_BandMember_Musician | 1 | 0 | | FK_MembershipPeriod_BandMember | 0 | 0 | +--------------------------------+------------------+---------------+