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

Comment renvoyer toutes les contraintes de clé étrangère non approuvées dans SQL Server (exemple T-SQL)

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