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

Renvoyer toutes les clés étrangères qui référencent une table donnée dans SQL Server

Si vous devez renvoyer toutes les clés étrangères qui font référence à une table donnée dans SQL Server, essayez l'une des méthodes suivantes.

La première méthode interroge les sys.foreign_keys vue système. La deuxième méthode exécute le sp_fkeys procédure stockée système.

Option 1 - sys.foreign_keys

Le code suivant récupère toutes les clés étrangères qui référencent une table donnée, ainsi que les tables de clé primaire et de clé étrangère. J'inclus également le schéma des tables de clés étrangères.

USE WideWorldImportersDW;
SELECT 
  OBJECT_NAME(referenced_object_id) AS [PK Table],
  name AS [Foreign Key],
  SCHEMA_NAME(schema_id) AS [FK Schema],
  OBJECT_NAME(parent_object_id) AS [FK Table]
FROM sys.foreign_keys
WHERE referenced_object_id = OBJECT_ID('Dimension.City');

Résultat :

+------------+---------------------------------------+-------------+------------+
| PK Table   | Foreign Key                           | FK Schema   | FK Table   |
|------------+---------------------------------------+-------------+------------|
| City       | FK_Fact_Order_City_Key_Dimension_City | Fact        | Order      |
| City       | FK_Fact_Sale_City_Key_Dimension_City  | Fact        | Sale       |
+------------+---------------------------------------+-------------+------------+

Dans ce cas, j'utilise le WideWorldImportersDW base de données, et je renvoie les clés étrangères qui font référence à Dimension.City table (la table Dimension.City table contient la colonne de clé primaire à laquelle les clés étrangères font référence).

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 qui référencent une table donnée, nous pouvons donc faire ceci :

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

Résultat (en utilisant la sortie verticale) :

-[ RECORD 1 ]-------------------------
PKTABLE_QUALIFIER | WideWorldImportersDW
PKTABLE_OWNER     | Dimension
PKTABLE_NAME      | City
PKCOLUMN_NAME     | City Key
FKTABLE_QUALIFIER | WideWorldImportersDW
FKTABLE_OWNER     | Fact
FKTABLE_NAME      | Order
FKCOLUMN_NAME     | City Key
KEY_SEQ           | 1
UPDATE_RULE       | 1
DELETE_RULE       | 1
FK_NAME           | FK_Fact_Order_City_Key_Dimension_City
PK_NAME           | PK_Dimension_City
DEFERRABILITY     | 7
-[ RECORD 2 ]-------------------------
PKTABLE_QUALIFIER | WideWorldImportersDW
PKTABLE_OWNER     | Dimension
PKTABLE_NAME      | City
PKCOLUMN_NAME     | City Key
FKTABLE_QUALIFIER | WideWorldImportersDW
FKTABLE_OWNER     | Fact
FKTABLE_NAME      | Sale
FKCOLUMN_NAME     | City Key
KEY_SEQ           | 1
UPDATE_RULE       | 1
DELETE_RULE       | 1
FK_NAME           | FK_Fact_Sale_City_Key_Dimension_City
PK_NAME           | PK_Dimension_City
DEFERRABILITY     | 7

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

EXEC sp_fkeys 
  @fktable_name = 'Order', 
  @fktable_owner = 'Fact';

Une vérification Vrai/Faux

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

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