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.