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.