Dans SQL Server, vous pouvez utiliser Transact-SQL pour renvoyer une liste de toutes les clés étrangères et CHECK
contraintes pour la base de données courante.
Les exemples de cette page interrogent deux vues système afin de récupérer ces informations :
sys.foreign_keys
et
sys.check_constraints
. Vous pouvez interroger chacun séparément ou utiliser UNION
pour les afficher tous dans un seul ensemble de résultats.
Exemple 1 – Ensemble de résultats combinés
Dans cet exemple, j'utilise UNION
pour retourner les clés étrangères et CHECK
contraintes dans le même jeu de résultats.
SELECT OBJECT_NAME(parent_object_id) AS 'Table', name AS 'Constraint', type_desc, is_disabled, is_not_trusted FROM sys.foreign_keys UNION SELECT OBJECT_NAME(parent_object_id), name, type_desc, is_disabled, is_not_trusted FROM sys.check_constraints;
Résultat :
+------------------+--------------------------------+------------------------+---------------+------------------+ | Table | Constraint | type_desc | is_disabled | is_not_trusted | |------------------+--------------------------------+------------------------+---------------+------------------| | BandMember | FK_BandMember_Band | FOREIGN_KEY_CONSTRAINT | 0 | 0 | | BandMember | FK_BandMember_Musician | FOREIGN_KEY_CONSTRAINT | 0 | 0 | | City | FK_City_Country | FOREIGN_KEY_CONSTRAINT | 0 | 0 | | MembershipPeriod | chkValidEndDate | CHECK_CONSTRAINT | 0 | 0 | | MembershipPeriod | FK_MembershipPeriod_BandMember | FOREIGN_KEY_CONSTRAINT | 0 | 0 | +------------------+--------------------------------+------------------------+---------------+------------------+
Dans ce cas, la base de données courante contient quatre clés étrangères et une CHECK
contrainte.
Nous pouvons également voir si chaque contrainte est activée ou désactivée, ainsi que si elle est fiable ou non.
Exemple 2 - Renvoyer toutes les colonnes
Ces deux vues renvoient plus de colonnes que ce que j'ai répertorié dans cet exemple. Vous pouvez toujours utiliser un caractère générique pour renvoyer toutes les colonnes. Cependant, si vous faites cela, vous ne pourrez pas utiliser UNION
, car chaque vue renvoie un nombre différent de colonnes.
Par conséquent, vous devrez les interroger séparément. Par exemple :
SELECT * FROM sys.foreign_keys; SELECT * FROM sys.check_constraints;
Cela produira deux jeux de résultats :l'un contenant les clés étrangères, l'autre contenant le CHECK
contraintes.
Pour économiser de l'espace, je n'afficherai pas les résultats de cette requête. Mais voici ce que produit la deuxième ligne (en utilisant la sortie verticale pour vous éviter d'avoir à faire défiler horizontalement) :
SELECT * FROM sys.check_constraints;
Résultat (en utilisant la sortie verticale) :
-[ RECORD 1 ]------------------------- name | chkValidEndDate object_id | 1525580473 principal_id | NULL schema_id | 1 parent_object_id | 1349579846 type | C type_desc | CHECK_CONSTRAINT create_date | 2019-09-11 00:33:02.587 modify_date | 2019-09-11 00:33:02.587 is_ms_shipped | 0 is_published | 0 is_schema_published | 0 is_disabled | 0 is_not_for_replication | 0 is_not_trusted | 0 parent_column_id | 0 definition | ([EndDate]>=[StartDate]) uses_database_collation | 1 is_system_named | 0
Vous pouvez inclure n'importe laquelle de ces colonnes dans votre requête, mais si vous la combinez avec les clés étrangères, assurez-vous d'inclure les mêmes colonnes dans les deux vues.
Les sys.foreign_keys
view renvoie quelques colonnes supplémentaires. Voici une requête modifiée, où je renvoie la première ligne (par nom) de cette vue.
SELECT TOP(1) * FROM sys.foreign_keys ORDER BY name;
Résultat (en utilisant la sortie verticale) :
-[ RECORD 1 ]------------------------- name | FK_BandMember_Band object_id | 1317579732 principal_id | NULL schema_id | 1 parent_object_id | 1285579618 type | F type_desc | FOREIGN_KEY_CONSTRAINT create_date | 2019-08-17 15:58:42.027 modify_date | 2019-08-17 15:58:42.027 is_ms_shipped | 0 is_published | 0 is_schema_published | 0 referenced_object_id | 1253579504 key_index_id | 1 is_disabled | 0 is_not_for_replication | 0 is_not_trusted | 0 delete_referential_action | 0 delete_referential_action_desc | NO_ACTION update_referential_action | 0 update_referential_action_desc | NO_ACTION is_system_named | 0