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

Renvoyer toutes les clés étrangères et les contraintes CHECK dans une base de données SQL Server (exemples T-SQL)

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