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

Répertorier toutes les clés étrangères d'une table dans SQL Server

Vous trouverez ci-dessous deux méthodes que vous pouvez utiliser pour renvoyer une liste de clés étrangères pour une table donnée dans SQL Server.

Cela revient à renvoyer les clés étrangères en fonction de la table de clés référencées/primaires, sauf qu'ici, je renvoie les clés étrangères en fonction de la table de référence/clés étrangères elle-même.

Option 1 - sys.foreign_keys

Le code suivant récupère toutes les contraintes de clé étrangère sur la table donnée, ainsi que les tables référencées.

USE WideWorldImportersDW;SELECT OBJECT_NAME(parent_object_id) AS [FK Table], name AS [Foreign Key], OBJECT_NAME(referenced_object_id) AS [PK Table]FROM sys.foreign_keysWHERE parent_object_id =OBJECT_ID('Fact.Order'); 

Résultat :

+------------+----------------------------------------------- ------------------+------------+| Tableau FK | Clé étrangère | Tableau PK ||------------+--------------------------------------------- ------------------+------------|| Commande | FK_Fact_Order_City_Key_Dimension_City | Ville || Commande | FK_Fact_Order_Customer_Key_Dimension_Customer | Client || Commande | FK_Fact_Order_Stock_Item_Key_Dimension_Article en stock | Article en stock || Commande | FK_Fact_Order_Order_Date_Key_Dimension_Date | Date || Commande | FK_Fact_Order_Picked_Date_Key_Dimension_Date | Date || Commande | FK_Fact_Order_Salesperson_Key_Dimension_Employee | Employé || Commande | FK_Fact_Order_Picker_Key_Dimension_Employee | Employé |+------------+------------------------------------------------ -----------------+------------+

Dans ce cas, j'utilise le WideWorldImportersDW base de données, et je renvoie les clés étrangères pour le Fact.Order tableau.

Option 2 - sp_fkeys

Une autre façon d'obtenir les clés étrangères qui référencent une table particulière est d'utiliser le sp_fkeys procédure stockée système. Cette procédure stockée nous offre le choix d'obtenir des clés étrangères en fonction (entre autres) de la table référencée ou de la table de référence.

Dans ce cas, nous souhaitons obtenir les clés étrangères basées sur la table de clés étrangères, nous pouvons donc faire ceci :

EXEC sp_fkeys @fktable_name ='Ordre', @fktable_owner ='Fait';

Résultat (en utilisant la sortie verticale) :

-[ ENREGISTREMENT 1 ]-------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | DimensionPKTABLE_NAME | VillePKCOLUMN_NAME | Clé de villeFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | FaitFKTABLE_NAME | CommandeFKCOLUMN_NAME | Clé de villeKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_City_Key_Dimension_CityPK_NAME | PK_Dimension_CityDEFERRABILITY | 7-[ ENREGISTREMENT 2 ]-------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | DimensionPKTABLE_NAME | ClientPKCOLUMN_NAME | Clé clientFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | FaitFKTABLE_NAME | CommandeFKCOLUMN_NAME | Clé clientKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Customer_Key_Dimension_CustomerPK_NAME | PK_Dimension_CustomerDEFERRABILITY | 7-[ ENREGISTREMENT 3 ]-------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | DimensionPKTABLE_NAME | DatePKCOLUMN_NAME | DateFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | FaitFKTABLE_NAME | CommandeFKCOLUMN_NAME | Clé de date de commandeKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Order_Date_Key_Dimension_DatePK_NAME | PK_Dimension_DateDEFERRABILITY | 7-[ ENREGISTREMENT 4 ]-------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | DimensionPKTABLE_NAME | DatePKCOLUMN_NAME | DateFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | FaitFKTABLE_NAME | CommandeFKCOLUMN_NAME | Clé de date sélectionnéeKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Picked_Date_Key_Dimension_DatePK_NAME | PK_Dimension_DateDEFERRABILITY | 7-[ ENREGISTREMENT 5 ]-------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | DimensionPKTABLE_NAME | EmployéPKCOLUMN_NAME | Clé d'employéFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | FaitFKTABLE_NAME | CommandeFKCOLUMN_NAME | Clé de vendeurKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Salesperson_Key_Dimension_EmployeePK_NAME | PK_Dimension_EmployeeDEFERRABILITY | 7-[ ENREGISTREMENT 6 ]-------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | DimensionPKTABLE_NAME | EmployéPKCOLUMN_NAME | Clé d'employéFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | FaitFKTABLE_NAME | CommandeFKCOLUMN_NAME | Clé de sélectionKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Picker_Key_Dimension_EmployeePK_NAME | PK_Dimension_EmployeeDEFERRABILITY | 7-[ ENREGISTREMENT 7 ]-------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | DimensionPKTABLE_NAME | Article en stockPKCOLUMN_NAME | Clé d'article en stockFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | FaitFKTABLE_NAME | CommandeFKCOLUMN_NAME | Clé de l'article en stockKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Stock_Item_Key_Dimension_Stock ItemPK_NAME | PK_Dimension_Stock_ItemDEFERRABILITY | 7

Cela peut facilement être inversé pour rechercher des clés étrangères basées sur la table de clés primaires en remplaçant simplement les paramètres par @pktable_name et @pktable_owner :

EXEC sp_fkeys @pktable_name ='Ville', @pktable_owner ='Dimension';

Une vérification Vrai/Faux

Si vous voulez simplement savoir si une table a ou non une clé étrangère, mais que vous ne voulez pas que tout soit répertorié, consultez Vérifier si une table a une clé étrangère dans SQL Server avec OBJECTPROPERTY().

Cet article utilise le TableHasForeignKey argument de OBJECTPROPERTY() fonction pour retourner 1 si la table a une clé étrangère, et 0 si ce n'est pas le cas.