Se você precisar retornar todas as chaves estrangeiras que fazem referência a uma determinada tabela no SQL Server, tente um dos seguintes métodos.
O primeiro método consulta o
sys.foreign_keys
visão do sistema. O segundo método executa o sp_fkeys
procedimento armazenado do sistema. Opção 1 – sys.foreign_keys
O código a seguir recupera todas as chaves estrangeiras que fazem referência a uma determinada tabela, juntamente com as tabelas de chave primária e chave estrangeira. Também incluo o esquema para as tabelas de chave estrangeira.
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');
Resultado:
+------------+---------------------------------------+-------------+------------+ | 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 | +------------+---------------------------------------+-------------+------------+
Neste caso, estou usando o WideWorldImportersDW banco de dados e estou retornando as chaves estrangeiras que fazem referência ao
Dimension.City
tabela (a Dimension.City
table contém a coluna de chave primária à qual as chaves estrangeiras fazem referência). 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 que fazem referência a uma determinada tabela, para que possamos fazer isso:
EXEC sp_fkeys @pktable_name = 'City', @pktable_owner = 'Dimension';
Resultado (usando saída vertical):
-[ 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
Isso pode ser facilmente alternado para procurar chaves estrangeiras com base na tabela de chaves estrangeiras simplesmente substituindo os parâmetros por
@fktable_name
e @fktable_owner
:EXEC sp_fkeys @fktable_name = 'Order', @fktable_owner = 'Fact';
Uma verificação de verdadeiro/falso
Se você simplesmente deseja saber se uma tabela é ou não referenciada por uma chave estrangeira, mas não quer que tudo seja listado, consulte Verificar se uma tabela é referenciada por uma chave estrangeira no SQL Server com OBJECTPROPERTY().
Esse artigo usa o
TableHasForeignRef
argumento do OBJECTPROPERTY()
função para retornar 1
se a tabela for referenciada por uma chave estrangeira e 0
se não for.