Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Listar todas as chaves estrangeiras em uma tabela no SQL Server


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 o Fact.Order tabela.

Opção 2 – sp_fkeys


Outra maneira de obter as chaves estrangeiras que fazem referência a uma tabela específica é usar o sp_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 a TableHasForeignKey argumento do OBJECTPROPERTY() função para retornar 1 se a tabela tiver uma chave estrangeira e 0 se não.