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

Restituisce tutte le chiavi esterne che fanno riferimento a una determinata tabella in SQL Server

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 è.