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 | 7
Moż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 argument OBJECTPROPERTY() funkcja zwracająca 1 jeśli tabela ma klucz obcy, a 0 jeśli nie.