Pokud potřebujete vrátit všechny cizí klíče, které odkazují na danou tabulku na serveru SQL Server, vyzkoušejte jednu z následujících metod.
První metoda se dotazuje na sys.foreign_keys
systémový pohled. Druhá metoda spustí sp_fkeys
systémová uložená procedura.
Možnost 1 – sys.foreign_keys
Následující kód načte všechny cizí klíče, které odkazují na danou tabulku, spolu s tabulkami primárního klíče a cizího klíče. Zahrnuji také schéma pro tabulky cizích klíčů.
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');
Výsledek:
+------------+---------------------------------------+-------------+------------+ | 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 | +------------+---------------------------------------+-------------+------------+
V tomto případě používám WideWorldImportersDW databázi a vracím cizí klíče, které odkazují na Dimension.City
tabulka (Dimension.City
tabulka obsahuje sloupec primárního klíče, na který odkazují cizí klíče).
Možnost 2 – sp_fkeys
Dalším způsobem, jak získat cizí klíče, které odkazují na konkrétní tabulku, je použít sp_fkeys
uložená procedura systému. Tato uložená procedura nám poskytuje možnost získat cizí klíče na základě (mimo jiné) referenční tabulky nebo referenční tabulky.
V tomto případě nás zajímá získání cizích klíčů, které odkazují na danou tabulku, takže můžeme udělat toto:
EXEC sp_fkeys @pktable_name = 'City', @pktable_owner = 'Dimension';
Výsledek (při použití vertikálního výstupu):
-[ 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
To lze snadno přepnout na vyhledávání cizích klíčů na základě tabulky cizích klíčů jednoduchým nahrazením parametrů @fktable_name
a @fktable_owner
:
EXEC sp_fkeys @fktable_name = 'Order', @fktable_owner = 'Fact';
Ověření pravdivosti/nepravdy
Pokud pouze chcete vědět, zda na tabulku odkazuje cizí klíč nebo ne, ale nechcete, aby byly všechny uvedeny, přečtěte si téma Kontrola, zda na tabulku odkazuje cizí klíč na serveru SQL pomocí OBJECTPROPERTY().
Tento článek používá TableHasForeignRef
argument OBJECTPROPERTY()
funkce vrátí 1
pokud na tabulku odkazuje cizí klíč, a 0
pokud není.