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

Encontre entidades de referência no SQL Server:sys.dm_sql_referencing_entities()


No SQL Server, você pode usar o sys.dm_sql_referencing_entities() função de gerenciamento dinâmico do sistema para obter uma lista de todas as entidades no banco de dados atual que fazem referência a outra entidade definida pelo usuário por nome.

Em outras palavras, ele retorna uma lista de entidades que dependem de determinada entidade.

Especificamente, ele relata os seguintes tipos de entidade no banco de dados atual que fazem referência à entidade especificada:
  • Entidades vinculadas ou não a esquema
  • Acionadores DDL no nível do banco de dados
  • Acionadores DDL no nível do servidor


Sintaxe


A sintaxe fica assim:
sys.dm_sql_referencing_entities (  
    ' schema_name.referenced_entity_name ' , '  ' )  
  
 ::=  
{  
    OBJECT  
  | TYPE  
  | XML_SCHEMA_COLLECTION  
  | PARTITION_FUNCTION  
}

Exemplo 1 – Exemplo básico


Aqui está um exemplo básico de uso:
USE WideWorldImporters;
SELECT *
FROM sys.dm_sql_referencing_entities (
    'Application.Cities', 
    'OBJECT');

Resultado:
+---------------------------+---------------------------+------------------+---------------------+--------------------------+-----------------------+
| referencing_schema_name   | referencing_entity_name   | referencing_id   | referencing_class   | referencing_class_desc   | is_caller_dependent   |
|---------------------------+---------------------------+------------------+---------------------+--------------------------+-----------------------|
| Application               | DetermineCustomerAccess   | 1051150790       | 1                   | OBJECT_OR_COLUMN         | 0                     |
| Integration               | GetCityUpdates            | 1758629308       | 1                   | OBJECT_OR_COLUMN         | 0                     |
| Website                   | Customers                 | 1694629080       | 1                   | OBJECT_OR_COLUMN         | 0                     |
| Website                   | SearchForCustomers        | 942626401        | 1                   | OBJECT_OR_COLUMN         | 0                     |
| Website                   | SearchForSuppliers        | 926626344        | 1                   | OBJECT_OR_COLUMN         | 0                     |
| Website                   | Suppliers                 | 1678629023       | 1                   | OBJECT_OR_COLUMN         | 0                     |
+---------------------------+---------------------------+------------------+---------------------+--------------------------+-----------------------+

Neste exemplo, há seis entidades que fazem referência a 'Application.Cities' no banco de dados 'WideWorldImporters'.

A Microsoft recomenda especificamente não usar o asterisco (* ) para selecionar todas as colunas de visualizações e funções de gerenciamento dinâmico (das quais sys.dm_sql_referencing_entities() é um). Isso ocorre porque seus esquemas e os dados que eles retornam podem ser alterados em versões futuras do SQL Server. Isso pode resultar na adição de colunas ao final da lista de colunas em versões futuras, o que pode atrapalhar seu aplicativo se você estiver contando com o asterisco para selecionar todas as colunas.

Portanto, o código anterior deve ser reescrito para isso:

Exemplo:
USE WideWorldImporters;
SELECT 
  referencing_schema_name,
  referencing_entity_name,
  referencing_id,
  referencing_class,
  referencing_class_desc,
  is_caller_dependent
FROM sys.dm_sql_referencing_entities (
    'Application.Cities', 
    'OBJECT');

Claro, você sempre pode especificar menos colunas, se quiser.

Exemplo 2 – Obter o tipo de entidade de referência


O exemplo acima é muito bom, mas não nos diz o tipo da entidade de referência. Em outras palavras, não podemos ver se é uma visão, um procedimento armazenado, etc.

Você pode obter essas informações juntando-se a sys.dm_sql_referencing_entities() com sys.objects .

Assim, poderíamos modificar o exemplo anterior assim:
SELECT 
  o.type_desc 'Type',
  re.referencing_schema_name 'Schema',
  re.referencing_entity_name 'Name'
FROM sys.dm_sql_referencing_entities (
    'Application.Cities', 
    'OBJECT') re
INNER JOIN sys.objects o
ON re.referencing_id = o.object_id
ORDER BY 'Type' ASC;  

Resultado:
+----------------------------------+-------------+-------------------------+
| Type                             | Schema      | Name                    |
|----------------------------------+-------------+-------------------------|
| SQL_INLINE_TABLE_VALUED_FUNCTION | Application | DetermineCustomerAccess |
| SQL_STORED_PROCEDURE             | Integration | GetCityUpdates          |
| SQL_STORED_PROCEDURE             | Website     | SearchForCustomers      |
| SQL_STORED_PROCEDURE             | Website     | SearchForSuppliers      |
| VIEW                             | Website     | Suppliers               |
| VIEW                             | Website     | Customers               |
+----------------------------------+-------------+-------------------------+

Exemplo 3 – Tipos definidos pelo usuário


Aqui está um exemplo de uso de sys.dm_sql_referencing_entities() para retornar entidades que fazem referência a um determinado tipo de alias definido pelo usuário.

Para este exemplo, criei um alias definido pelo usuário chamado clientcode . Em seguida, usei-o em duas colunas (em duas tabelas diferentes) e também criei um procedimento armazenado que faz referência ao tipo por nome (ele aceita um argumento chamado @ClientCode que é do clientcode tipo).

Para retornar um tipo definido pelo usuário, use TYPE como segundo argumento.

Exemplo:
USE Test;
SELECT 
  referencing_entity_name
FROM sys.dm_sql_referencing_entities (
    'dbo.clientcode', 
    'TYPE');

Resultado:
+---------------------------+
| referencing_entity_name   |
|---------------------------|
| uspGetClient              |
| uspGetOrdersByClient      |
+---------------------------+

Eu posso dizer pelos nomes que ambos são procedimentos armazenados (ambos são prefixados com usp , que é uma convenção comum ao criar procedimentos armazenados definidos pelo usuário), mas podemos confirmar isso verificando o sys.objects vista do catálogo do sistema mais uma vez:
SELECT 
  o.type_desc 'Type',
  re.referencing_schema_name 'Schema',
  re.referencing_entity_name 'Name'
FROM sys.dm_sql_referencing_entities (
    'dbo.clientcode', 
    'TYPE') re
INNER JOIN sys.objects o
ON re.referencing_id = o.object_id
ORDER BY 'Type' ASC;  

Resultado:
+----------------------+----------+----------------------+
| Type                 | Schema   | Name                 |
|----------------------+----------+----------------------|
| SQL_STORED_PROCEDURE | dbo      | uspGetClient         |
| SQL_STORED_PROCEDURE | dbo      | uspGetOrdersByClient |
+----------------------+----------+----------------------+

Observe que esse tipo de alias é usado nas colunas de duas tabelas nesse banco de dados. No entanto, eles não aparecem em nossa lista de dependências porque o tipo definido pelo usuário não está na definição de uma coluna computada, CHECK restrição ou DEFAULT restrição na tabela.

Além disso, uma das tabelas faz referência à outra tabela por meio de uma restrição de chave estrangeira na coluna que usa o dbo.clientcode tipo definido pelo usuário, mas isso também não aparece em nossa lista.

Documentação oficial


Para obter informações mais detalhadas, consulte sys.dm_sql_referencing_entities no site da Microsoft.