sql >> Databasteknik >  >> RDS >> Sqlserver

Returnera alla främmande nycklar som refererar till en given tabell i SQL Server

Om du behöver returnera alla främmande nycklar som refererar till en given tabell i SQL Server, prova någon av följande metoder.

Den första metoden frågar efter sys.foreign_keys systemvy. Den andra metoden exekverar sp_fkeys systemlagrad procedur.

Alternativ 1 – sys.foreign_keys

Följande kod hämtar alla främmande nycklar som refererar till en given tabell, tillsammans med primärnyckeln och tabellerna för främmande nyckel. Jag inkluderar också schemat för de främmande nyckeltabellerna.

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

Resultat:

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

I det här fallet använder jag WideWorldImportersDW databas, och jag returnerar främmande nycklar som refererar till Dimension.City tabellen (Dimension.City Tabellen innehåller primärnyckelkolumnen som de främmande nycklarna refererar till).

Alternativ 2 – sp_fkeys

Ett annat sätt att få främmande nycklar som refererar till en viss tabell är att använda sp_fkeys systemlagrad procedur. Denna lagrade procedur ger oss ett val att hämta främmande nycklar baserat på (bland annat) den refererade tabellen eller referenstabellen.

I det här fallet är vi intresserade av att få främmande nycklar som refererar till en given tabell, så vi kan göra detta:

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

Resultat (med vertikal utdata):

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

Detta kan enkelt växlas runt för att söka efter främmande nycklar baserat på tabellen med främmande nyckel genom att helt enkelt ersätta parametrarna med @fktable_name och @fktable_owner :

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

En sann/falsk kontroll

Om du bara vill veta om en tabell refereras av en främmande nyckel eller inte, men du inte vill att allt ska listas ut, se Kontrollera om en tabell refereras av en främmande nyckel i SQL Server med OBJECTPROPERTY().

Den artikeln använder TableHasForeignRef argument för OBJECTPROPERTY() funktion för att returnera 1 om tabellen refereras av en främmande nyckel, och 0 om det inte är det.


  1. Kör Oracle Forms som fristående utan webbläsare

  2. Oracle SQL:Använd sekvens i infogning med Select Statement

  3. Hur kan jag slå samman kolumnerna från två tabeller till en utdata?

  4. Implementering av Optimistic Locking i Oracle