Poniżej znajdują się dwie metody, których można użyć do zwrócenia listy kluczy obcych dla danej tabeli w SQL Server.
Jest to podobne do zwracania kluczy obcych na podstawie tabeli kluczy referencyjnych/podstawowych, z wyjątkiem tego, że zwracam klucze obce na podstawie samej tabeli kluczy referencyjnych/obcych.
Opcja 1 – sys.foreign_keys
Poniższy kod pobiera wszystkie ograniczenia klucza obcego w danej tabeli, wraz z tabelami, do których się odwołuje.
USE WideWorldImportersDW;SELECT OBJECT_NAME(parent_object_id) AS [FK Table], name AS [Foreign Key], OBJECT_NAME(referenced_object_id) AS [PK Table]FROM sys.foreign_keysWHERE parent_object_id =OBJECT_ID('Fact.Order'); pre>Wynik:
+--------------------------+--------------------------------- -------+-------------+| Tabela FK | Klucz obcy | Tablica PK ||------------+--------------------------------- ------------------+------------|| Zamów | FK_Fact_Order_City_Key_Dimension_City | Miasto || Zamów | FK_Fact_Order_Customer_Key_Dimension_Customer | Klient || Zamów | FK_Fact_Order_Stock_Item_Key_Dimension_Stock Item | Pozycja magazynowa || Zamów | FK_Fact_Order_Order_Date_Key_Dimension_Date | Data || Zamów | FK_Fact_Order_Picked_Date_Key_Dimension_Date | Data || Zamów | FK_Fact_Order_Salesperson_Key_Dimension_Employee | Pracownik || Zamów | FK_Fact_Order_Picker_Key_Dimension_Employee | Pracownik |+--------------------------+-------------------------------------- -----------------+------------+W tym przypadku używam WideWorldImportersDW bazy danych i zwracam klucze obce dla
Fact.Order
tabela.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 na podstawie tabeli kluczy obcych, więc możemy to zrobić:
EXEC sp_fkeys @fktable_name ='Zamówienie', @fktable_owner ='Fakt';Wynik (przy użyciu wyjścia pionowego):
-[ REKORD 1 ]-------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | WymiarPKTABLE_NAME | MiastoPKCOLUMN_NAME | Klucz miastaFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | FaktFKTABLE_NAME | ZamówFKCOLUMN_NAME | Klucz miasta KEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_City_Key_Dimension_CityPK_NAME | PK_Dimension_CityDEFERRABILITY | 7-[ REKORD 2 ]-------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | WymiarPKTABLE_NAME | CustomerPKCOLUMN_NAME | Klucz klientaFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | FaktFKTABLE_NAME | ZamówFKCOLUMN_NAME | Klucz klienta KEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Customer_Key_Dimension_CustomerPK_NAME | PK_Dimension_CustomerDEFERRABILITY | 7-[ REKORD 3 ]-------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | WymiarPKTABLE_NAME | DataPKCOLUMN_NAME | DataFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | FaktFKTABLE_NAME | ZamówFKCOLUMN_NAME | Data zamówienia KeyKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Order_Date_Key_Dimension_DatePK_NAME | PK_Dimension_DateDEFERRABILITY | 7-[ REKORD 4 ]-------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | WymiarPKTABLE_NAME | DataPKCOLUMN_NAME | DataFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | FaktFKTABLE_NAME | ZamówFKCOLUMN_NAME | Wybrana data KeyKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Picked_Date_Key_Dimension_DatePK_NAME | PK_Dimension_DateDEFERRABILITY | 7-[ REKORD 5 ]-------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | WymiarPKTABLE_NAME | PracownikPKCOLUMN_NAME | Klucz pracownikaFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | FaktFKTABLE_NAME | ZamówFKCOLUMN_NAME | Sprzedawca KeyKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Salesperson_Key_Dimension_EmployeePK_NAME | PK_Dimension_EmployeeDEFERRABILITY | 7-[ REKORD 6 ]-------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | WymiarPKTABLE_NAME | PracownikPKCOLUMN_NAME | Klucz pracownikaFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | FaktFKTABLE_NAME | ZamówFKCOLUMN_NAME | Selektor KeyKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Picker_Key_Dimension_EmployeePK_NAME | PK_Dimension_EmployeeDEFERRABILITY | 7-[ REKORD 7 ]-------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | WymiarPKTABLE_NAME | Pozycja magazynowaPKCOLUMN_NAME | Pozycja magazynowa KeyFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | FaktFKTABLE_NAME | ZamówFKCOLUMN_NAME | Pozycja magazynowa KeyKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Stock_Item_Key_Dimension_Stock ItemPK_NAME | PK_Dimension_Stock_ItemDEFERRABILITY | 7Można to łatwo zmienić, aby wyszukać klucze obce na podstawie tabeli kluczy podstawowych, po prostu zastępując parametry
@pktable_name
i@pktable_owner
:EXEC sp_fkeys @pktable_name ='Miasto', @pktable_owner ='Wymiar';Prawda/fałszywa kontrola
Jeśli chcesz po prostu wiedzieć, czy tabela ma klucz obcy, ale nie chcesz, aby wszystko było wymienione, zobacz Sprawdź, czy tabela ma klucz obcy w SQL Server za pomocą OBJECTPROPERTY().
Ten artykuł używa
TableHasForeignKey
argumentOBJECTPROPERTY()
funkcja zwracająca1
jeśli tabela ma klucz obcy, a0
jeśli nie.