Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Alle Fremdschlüssel zurückgeben, die auf eine bestimmte Tabelle in SQL Server verweisen

Wenn Sie alle Fremdschlüssel zurückgeben müssen, die auf eine bestimmte Tabelle in SQL Server verweisen, versuchen Sie eine der folgenden Methoden.

Die erste Methode fragt die sys.foreign_keys ab Systemansicht. Die zweite Methode führt die sp_fkeys aus gespeicherte Systemprozedur.

Option 1 – sys.foreign_keys

Der folgende Code ruft alle Fremdschlüssel ab, die auf eine bestimmte Tabelle verweisen, zusammen mit den Primärschlüssel- und Fremdschlüsseltabellen. Ich füge auch das Schema für die Fremdschlüsseltabellen hinzu.

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');

Ergebnis:

+------------+---------------------------------------+-------------+------------+
| 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       |
+------------+---------------------------------------+-------------+------------+

In diesem Fall verwende ich die WideWorldImportersDW Datenbank, und ich gebe die Fremdschlüssel zurück, die auf Dimension.City verweisen Tabelle (die Dimension.City Tabelle enthält die Primärschlüsselspalte, auf die die Fremdschlüssel verweisen).

Option 2 – sp_fkeys

Eine andere Möglichkeit, die Fremdschlüssel zu erhalten, die auf eine bestimmte Tabelle verweisen, ist die Verwendung von sp_fkeys System gespeicherte Prozedur. Diese gespeicherte Prozedur bietet uns die Wahl, Fremdschlüssel (unter anderem) basierend auf der referenzierten Tabelle oder der referenzierenden Tabelle zu erhalten.

In diesem Fall sind wir daran interessiert, die Fremdschlüssel zu erhalten, die auf eine bestimmte Tabelle verweisen, also können wir Folgendes tun:

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

Ergebnis (bei vertikaler Ausgabe):

-[ 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

Dies kann leicht umgeschaltet werden, um anhand der Fremdschlüsseltabelle nach Fremdschlüsseln zu suchen, indem Sie einfach die Parameter durch @fktable_name ersetzen und @fktable_owner :

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

Ein Wahr/Falsch-Check

Wenn Sie nur wissen möchten, ob eine Tabelle von einem Fremdschlüssel referenziert wird oder nicht, aber nicht alles aufgelistet haben möchten, lesen Sie Überprüfen, ob eine Tabelle von einem Fremdschlüssel in SQL Server mit OBJECTPROPERTY() referenziert wird.

Dieser Artikel verwendet die TableHasForeignRef Argument von OBJECTPROPERTY() Funktion, um 1 zurückzugeben wenn die Tabelle von einem Fremdschlüssel referenziert wird, und 0 wenn nicht.