sql >> Databáze >  >> RDS >> Sqlserver

Vrátit všechny cizí klíče, které odkazují na danou tabulku v SQL Server

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


  1. Jak vybrat správnou databázi pro vaši firmu

  2. SQLSTATE[HY000] [1045] Přístup odepřen uživateli 'username'@'localhost' pomocí CakePHP

  3. Vyberte nejběžnější hodnotu z pole v MySQL

  4. Chyba MySQL 1153 – Mám paket větší než bajtů „max_allowed_packet“