Se è necessario restituire tutte le chiavi esterne che fanno riferimento a una determinata tabella in SQL Server, provare uno dei metodi seguenti.
Il primo metodo interroga sys.foreign_keys
vista del sistema. Il secondo metodo esegue sp_fkeys
procedura memorizzata di sistema.
Opzione 1 – sys.foreign_keys
Il codice seguente recupera tutte le chiavi esterne che fanno riferimento a una determinata tabella, insieme alle tabelle della chiave primaria e della chiave esterna. Includo anche lo schema per le tabelle delle chiavi esterne.
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');
Risultato:
+------------+---------------------------------------+-------------+------------+ | 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 questo caso sto usando WideWorldImportersDW database e restituisco le chiavi esterne che fanno riferimento a Dimension.City
tabella (il Dimension.City
contiene la colonna della chiave primaria a cui fanno riferimento le chiavi esterne).
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 che fanno riferimento a una determinata tabella, quindi possiamo farlo:
EXEC sp_fkeys @pktable_name = 'City', @pktable_owner = 'Dimension';
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 | 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
Questo può essere facilmente cambiato per cercare chiavi esterne in base alla tabella delle chiavi esterne semplicemente sostituendo i parametri con @fktable_name
e @fktable_owner
:
EXEC sp_fkeys @fktable_name = 'Order', @fktable_owner = 'Fact';
Un controllo vero/falso
Se vuoi semplicemente sapere se una tabella è referenziata o meno da una chiave esterna, ma non vuoi che sia elencata tutta, vedi Verifica se una tabella è referenziata da una chiave esterna in SQL Server con OBJECTPROPERTY().
Quell'articolo usa il TableHasForeignRef
argomento di OBJECTPROPERTY()
funzione per restituire 1
se la tabella è referenziata da una chiave esterna e 0
se non lo è.