Abaixo estão dois métodos que você pode usar para retornar uma lista de chaves estrangeiras para uma determinada tabela no SQL Server.
Isso é semelhante a retornar as chaves estrangeiras com base na tabela de chave referenciada/primária, exceto que aqui estou retornando as chaves estrangeiras com base na própria tabela de referência/chave estrangeira.
Opção 1 – sys.foreign_keys
O código a seguir recupera todas as restrições de chave estrangeira na tabela fornecida, juntamente com as tabelas referenciadas.
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');
Resultado:
+------------+--------------------------------- ------------------+------------+| Mesa FK | Chave estrangeira | Tabela PK ||------------+--------------------------------- ------------------+------------|| Encomenda | FK_Fact_Order_City_Key_Dimension_City | Cidade || Encomenda | FK_Fact_Order_Customer_Key_Dimension_Customer | Cliente || Encomenda | FK_Fact_Order_Stock_Item_Key_Dimension_Stock Item | Item de Estoque || Encomenda | FK_Fact_Order_Order_Date_Key_Dimension_Date | Data || Encomenda | FK_Fact_Order_Picked_Date_Key_Dimension_Date | Data || Encomenda | FK_Fact_Order_Salesperson_Key_Dimension_Employee | Funcionário || Encomenda | FK_Fact_Order_Picker_Key_Dimension_Employee | Funcionário |+------------+---------------------------------- --+------------+
Neste caso, estou usando o WideWorldImportersDW banco de dados e estou retornando as chaves estrangeiras para oFact.Order
tabela.
Opção 2 – sp_fkeys
Outra maneira de obter as chaves estrangeiras que fazem referência a uma tabela específica é usar osp_fkeys
procedimento armazenado do sistema. Esse procedimento armazenado nos fornece a opção de obter chaves estrangeiras com base (entre outras coisas) na tabela referenciada ou na tabela de referência.
Nesse caso, estamos interessados em obter as chaves estrangeiras com base na tabela de chaves estrangeiras, então podemos fazer isso:
EXEC sp_fkeys @fktable_name ='Pedido', @fktable_owner ='Fato';
Resultado (usando saída vertical):
-[ RECORD 1 ]-----------------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | DimensãoPKTABLE_NAME | CidadePKCOLUMN_NAME | Chave da cidadeFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | FatoFKTABLE_NAME | EncomendaFKCOLUMN_NAME | Cidade KeyKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_City_Key_Dimension_CityPK_NAME | PK_Dimension_CityDEFERRABILITY | 7-[ RECORD 2 ]-----------------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | DimensãoPKTABLE_NAME | ClientePKCOLUMN_NAME | Chave do clienteFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | FatoFKTABLE_NAME | EncomendaFKCOLUMN_NAME | Chave do clienteKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Customer_Key_Dimension_CustomerPK_NAME | PK_Dimension_CustomerDEFERRABILITY | 7-[ RECORD 3 ] -------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | DimensãoPKTABLE_NAME | DataPKCOLUMN_NAME | DataFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | FatoFKTABLE_NAME | EncomendaFKCOLUMN_NAME | Data do pedido KeyKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Order_Date_Key_Dimension_DatePK_NAME | PK_Dimension_DateDEFERRABILITY | 7-[ RECORD 4 ]-----------------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | DimensãoPKTABLE_NAME | DataPKCOLUMN_NAME | DataFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | FatoFKTABLE_NAME | EncomendaFKCOLUMN_NAME | Data escolhida KeyKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Picked_Date_Key_Dimension_DatePK_NAME | PK_Dimension_DateDEFERRABILITY | 7-[ RECORD 5 ] -------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | DimensãoPKTABLE_NAME | FuncionárioPKCOLUMN_NAME | Chave de funcionárioFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | FatoFKTABLE_NAME | EncomendaFKCOLUMN_NAME | KeyKEY_SEQ do vendedor | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Salesperson_Key_Dimension_EmployeePK_NAME | PK_Dimension_EmployeeDEFERRABILITY | 7-[ RECORD 6 ] -------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | DimensãoPKTABLE_NAME | FuncionárioPKCOLUMN_NAME | Chave de funcionárioFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | FatoFKTABLE_NAME | EncomendaFKCOLUMN_NAME | Seletor KeyKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Picker_Key_Dimension_EmployeePK_NAME | PK_Dimension_EmployeeDEFERRABILITY | 7-[ RECORD 7 ] -------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | DimensãoPKTABLE_NAME | Item de estoquePKCOLUMN_NAME | Chave de item de estoqueFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | FatoFKTABLE_NAME | EncomendaFKCOLUMN_NAME | Item de estoque KeyKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Stock_Item_Key_Dimension_Stock ItemPK_NAME | PK_Dimension_Stock_ItemDEFERRABILITY | 7
Isso pode ser facilmente alternado para pesquisar chaves estrangeiras com base na tabela de chaves primárias simplesmente substituindo os parâmetros por@pktable_name
e@pktable_owner
:
EXEC sp_fkeys @pktable_name ='Cidade', @pktable_owner ='Dimensão';Uma verificação de verdadeiro/falso
Se você simplesmente quer saber se uma tabela tem ou não uma chave estrangeira, mas não quer tudo listado, consulte Verificar se uma tabela tem uma chave estrangeira no SQL Server com OBJECTPROPERTY().
Esse artigo usa aTableHasForeignKey
argumento doOBJECTPROPERTY()
função para retornar1
se a tabela tiver uma chave estrangeira e0
se não.