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

Retornar todas as chaves estrangeiras que fazem referência a uma determinada tabela no SQL Server


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.