Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Elenca tutte le chiavi esterne su una tabella in SQL Server

Di seguito sono riportati due metodi che è possibile utilizzare per restituire un elenco di chiavi esterne per una determinata tabella in SQL Server.

Questo è simile alla restituzione delle chiavi esterne in base alla tabella delle chiavi di riferimento/primarie, tranne che qui sto restituendo le chiavi esterne in base alla tabella delle chiavi esterne/di riferimento stessa.

Opzione 1 – sys.foreign_keys

Il codice seguente recupera tutti i vincoli di chiave esterna nella tabella specificata, insieme alle tabelle di riferimento.

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_keys
WHERE parent_object_id = OBJECT_ID('Fact.Order');

Risultato:

+------------+---------------------------------------------------+------------+
| FK Table   | Foreign Key                                       | PK Table   |
|------------+---------------------------------------------------+------------|
| Order      | FK_Fact_Order_City_Key_Dimension_City             | City       |
| Order      | FK_Fact_Order_Customer_Key_Dimension_Customer     | Customer   |
| Order      | FK_Fact_Order_Stock_Item_Key_Dimension_Stock Item | Stock Item |
| Order      | FK_Fact_Order_Order_Date_Key_Dimension_Date       | Date       |
| Order      | FK_Fact_Order_Picked_Date_Key_Dimension_Date      | Date       |
| Order      | FK_Fact_Order_Salesperson_Key_Dimension_Employee  | Employee   |
| Order      | FK_Fact_Order_Picker_Key_Dimension_Employee       | Employee   |
+------------+---------------------------------------------------+------------+

In questo caso sto usando WideWorldImportersDW database e sto restituendo le chiavi esterne per Fact.Order tabella.

Opzione 2 – sp_fkeys

Un altro modo per ottenere le chiavi esterne che fanno riferimento a una tabella particolare è utilizzare sp_fkeys procedura memorizzata di sistema. Questa procedura memorizzata ci offre la possibilità di ottenere chiavi esterne in base (tra le altre cose) alla tabella di riferimento o alla tabella di riferimento.

In questo caso siamo interessati a ottenere le chiavi esterne in base alla tabella delle chiavi esterne, quindi possiamo farlo:

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

Risultato (usando l'output 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      | Customer
PKCOLUMN_NAME     | Customer Key
FKTABLE_QUALIFIER | WideWorldImportersDW
FKTABLE_OWNER     | Fact
FKTABLE_NAME      | Order
FKCOLUMN_NAME     | Customer Key
KEY_SEQ           | 1
UPDATE_RULE       | 1
DELETE_RULE       | 1
FK_NAME           | FK_Fact_Order_Customer_Key_Dimension_Customer
PK_NAME           | PK_Dimension_Customer
DEFERRABILITY     | 7
-[ RECORD 3 ]-------------------------
PKTABLE_QUALIFIER | WideWorldImportersDW
PKTABLE_OWNER     | Dimension
PKTABLE_NAME      | Date
PKCOLUMN_NAME     | Date
FKTABLE_QUALIFIER | WideWorldImportersDW
FKTABLE_OWNER     | Fact
FKTABLE_NAME      | Order
FKCOLUMN_NAME     | Order Date Key
KEY_SEQ           | 1
UPDATE_RULE       | 1
DELETE_RULE       | 1
FK_NAME           | FK_Fact_Order_Order_Date_Key_Dimension_Date
PK_NAME           | PK_Dimension_Date
DEFERRABILITY     | 7
-[ RECORD 4 ]-------------------------
PKTABLE_QUALIFIER | WideWorldImportersDW
PKTABLE_OWNER     | Dimension
PKTABLE_NAME      | Date
PKCOLUMN_NAME     | Date
FKTABLE_QUALIFIER | WideWorldImportersDW
FKTABLE_OWNER     | Fact
FKTABLE_NAME      | Order
FKCOLUMN_NAME     | Picked Date Key
KEY_SEQ           | 1
UPDATE_RULE       | 1
DELETE_RULE       | 1
FK_NAME           | FK_Fact_Order_Picked_Date_Key_Dimension_Date
PK_NAME           | PK_Dimension_Date
DEFERRABILITY     | 7
-[ RECORD 5 ]-------------------------
PKTABLE_QUALIFIER | WideWorldImportersDW
PKTABLE_OWNER     | Dimension
PKTABLE_NAME      | Employee
PKCOLUMN_NAME     | Employee Key
FKTABLE_QUALIFIER | WideWorldImportersDW
FKTABLE_OWNER     | Fact
FKTABLE_NAME      | Order
FKCOLUMN_NAME     | Salesperson Key
KEY_SEQ           | 1
UPDATE_RULE       | 1
DELETE_RULE       | 1
FK_NAME           | FK_Fact_Order_Salesperson_Key_Dimension_Employee
PK_NAME           | PK_Dimension_Employee
DEFERRABILITY     | 7
-[ RECORD 6 ]-------------------------
PKTABLE_QUALIFIER | WideWorldImportersDW
PKTABLE_OWNER     | Dimension
PKTABLE_NAME      | Employee
PKCOLUMN_NAME     | Employee Key
FKTABLE_QUALIFIER | WideWorldImportersDW
FKTABLE_OWNER     | Fact
FKTABLE_NAME      | Order
FKCOLUMN_NAME     | Picker Key
KEY_SEQ           | 1
UPDATE_RULE       | 1
DELETE_RULE       | 1
FK_NAME           | FK_Fact_Order_Picker_Key_Dimension_Employee
PK_NAME           | PK_Dimension_Employee
DEFERRABILITY     | 7
-[ RECORD 7 ]-------------------------
PKTABLE_QUALIFIER | WideWorldImportersDW
PKTABLE_OWNER     | Dimension
PKTABLE_NAME      | Stock Item
PKCOLUMN_NAME     | Stock Item Key
FKTABLE_QUALIFIER | WideWorldImportersDW
FKTABLE_OWNER     | Fact
FKTABLE_NAME      | Order
FKCOLUMN_NAME     | Stock Item Key
KEY_SEQ           | 1
UPDATE_RULE       | 1
DELETE_RULE       | 1
FK_NAME           | FK_Fact_Order_Stock_Item_Key_Dimension_Stock Item
PK_NAME           | PK_Dimension_Stock_Item
DEFERRABILITY     | 7

Questo può essere facilmente cambiato per cercare chiavi esterne in base alla tabella delle chiavi primarie semplicemente sostituendo i parametri con @pktable_name e @pktable_owner :

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

Un controllo vero/falso

Se vuoi semplicemente sapere se una tabella ha o meno una chiave esterna, ma non vuoi che venga elencata tutta, vedi Verifica se una tabella ha una chiave esterna in SQL Server con OBJECTPROPERTY().

Quell'articolo usa il TableHasForeignKey argomento di OBJECTPROPERTY() funzione per restituire 1 se la tabella ha una chiave esterna e 0 in caso contrario.