Jeśli musisz zwrócić wszystkie klucze obce, które odwołują się do danej tabeli w programie SQL Server, wypróbuj jedną z następujących metod.
Pierwsza metoda wysyła zapytanie do sys.foreign_keys
widok systemu. Druga metoda wykonuje sp_fkeys
systemowa procedura składowana.
Opcja 1 – sys.foreign_keys
Poniższy kod pobiera wszystkie klucze obce, które odwołują się do danej tabeli, wraz z kluczami podstawowymi i tabelami kluczy obcych. Dołączam również schemat dla tabel kluczy obcych.
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');
Wynik:
+------------+---------------------------------------+-------------+------------+ | 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 | +------------+---------------------------------------+-------------+------------+
W tym przypadku używam WideWorldImportersDW i zwracam klucze obce, które odwołują się do Dimension.City
tabela (Dimension.City
tabela zawiera główną kolumnę klucza, do której odwołują się klucze obce).
Opcja 2 – sp_fkeys
Innym sposobem na uzyskanie kluczy obcych, które odwołują się do konkretnej tabeli, jest użycie sp_fkeys
systemowa procedura składowana. Ta procedura składowana daje nam możliwość wyboru pobierania kluczy obcych na podstawie (między innymi) tabeli odniesienia lub tabeli odniesienia.
W tym przypadku jesteśmy zainteresowani uzyskaniem kluczy obcych, które odwołują się do danej tabeli, więc możemy to zrobić:
EXEC sp_fkeys @pktable_name = 'City', @pktable_owner = 'Dimension';
Wynik (przy użyciu wyjścia pionowego):
-[ 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
Można to łatwo zmienić, aby wyszukać klucze obce na podstawie tabeli kluczy obcych, po prostu zastępując parametry @fktable_name
i @fktable_owner
:
EXEC sp_fkeys @fktable_name = 'Order', @fktable_owner = 'Fact';
Prawda/fałszywa kontrola
Jeśli chcesz po prostu wiedzieć, czy do tabeli odwołuje się klucz obcy, ale nie chcesz, aby wszystko było wymienione, zobacz Sprawdź, czy do tabeli odwołuje się klucz obcy w SQL Server za pomocą OBJECTPROPERTY().
Ten artykuł używa TableHasForeignRef
argument OBJECTPROPERTY()
funkcja zwracająca 1
jeśli do tabeli odwołuje się klucz obcy, a 0
jeśli nie.