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 | 7Cela 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 deOBJECTPROPERTY()
fonction pour retourner1
si la table a une clé étrangère, et0
si ce n'est pas le cas.