Partilhar via


sys.dm_sql_referenced_entities (Transact-SQL)

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBase de dados SQL no Microsoft Fabric

Devolve uma linha para cada entidade definida pelo utilizador que seja referenciada pelo nome na definição da entidade de referência especificada no SQL Server. Uma dependência entre duas entidades é criada quando uma entidade definida pelo utilizador, chamada entidade referenciada, aparece pelo nome numa expressão SQL persistente de outra entidade definida pelo utilizador, chamada entidade referenciadora. Por exemplo, se um procedimento armazenado for a entidade de referência especificada, esta função devolve todas as entidades definidas pelo utilizador que são referenciadas no procedimento armazenado, como tabelas, vistas, tipos definidos pelo utilizador (UDTs) ou outros procedimentos armazenados.

Pode usar esta função de gestão dinâmica para reportar os seguintes tipos de entidades referenciadas pela entidade de referência especificada:

  • Entidades limitadas ao esquema

  • Entidades não limitadas a esquemas

  • Entidades entre bases de dados e entre servidores

  • Dependências ao nível das colunas em entidades limitadas e não vinculadas ao esquema

  • Tipos definidos pelo utilizador (alias e CLR UDT)

  • Coleções de esquema XML

  • Funções de partição

Sintaxe

sys.dm_sql_referenced_entities (  
    ' [ schema_name. ] referencing_entity_name ' ,
    ' <referencing_class> ' )  
  
<referencing_class> ::=  
{  
    OBJECT  
  | DATABASE_DDL_TRIGGER  
  | SERVER_DDL_TRIGGER  
}  

Arguments

[ schema_name. ] referencing_entity_name
É o nome da entidade referenciadora. schema_name é exigido quando a classe de referência é OBJECT.

schema_name.nome_de_entidade_referencial é nvarchar(517).

<referencing_class> ::= { OBJETO | DATABASE_DDL_TRIGGER | SERVER_DDL_TRIGGER }
É a classe da entidade referenciadora especificada. Apenas uma classe pode ser especificada por afirmação.

<referencing_class> é Nvarchar(60).

Tabela retornada

Nome da coluna Tipo de dados Description
referencing_minor_id int ID de coluna quando a entidade referenciadora é uma coluna; caso contrário, 0. Não é anulável.
referenced_server_name sysname Nome do servidor da entidade referenciada.

Esta coluna é preenchida para dependências entre servidores criadas especificando um nome válido de quatro partes. Para informações sobre nomes multipartes, veja Transact-SQL convenções sintáticas.

NULL para dependências não limitadas a esquemas para as quais a entidade foi referenciada sem especificar um nome em quatro partes.

NULL para entidades limitadas ao esquema porque devem estar na mesma base de dados e, portanto, só podem ser definidas usando um nome de duas partes (schema.object).
referenced_database_name sysname Nome da base de dados da entidade referenciada.

Esta coluna é preenchida para referências cross-database ou cross-server que são feitas especificando um nome válido de três ou quatro partes.

NULL para referências não ligadas ao esquema quando especificado usando um nome de uma ou duas partes.

NULL para entidades limitadas ao esquema porque devem estar na mesma base de dados e, portanto, só podem ser definidas usando um nome de duas partes (schema.object).
referenced_schema_name sysname Esquema ao qual pertence a entidade referenciada.

NULL para referências não vinculadas ao esquema em que a entidade foi referenciada sem especificar o nome do esquema.

Nunca NULL para referências limitadas ao esquema.
referenced_entity_name sysname Nome da entidade referenciada. Não é anulável.
referenced_minor_name sysname Nome da coluna quando a entidade referenciada é uma coluna; caso contrário, NULL. Por exemplo, referenced_minor_name é NULL na linha que lista a própria entidade referenciada.

Uma entidade referenciada é uma coluna quando uma coluna é identificada pelo nome na entidade referenciadora, ou quando a entidade-mãe é usada numa instrução SELECT *.
referenced_id int ID da entidade referenciada. Quando referenced_minor_id não é 0, referenced_id é a entidade em que a coluna está definida.

Sempre NULL para referências entre servidores.

NULL para referências entre bases de dados quando o ID não pode ser determinado porque a base de dados está offline ou a entidade não pode ser limitada.

NULL para referências dentro da base de dados se o ID não puder ser determinado. Para referências não limitadas ao esquema, o ID não pode ser resolvido quando a entidade referenciada não existe na base de dados ou quando a resolução do nome depende do chamador. Neste último caso, is_caller_dependent é definido para 1.

Nunca NULL para referências limitadas ao esquema.
referenced_minor_id int ID de coluna quando a entidade referenciada é uma coluna; caso contrário, 0. Por exemplo, referenced_minor_is é 0 na linha que lista a própria entidade referenciada.

Para referências não limitadas a esquemas, as dependências das colunas são reportadas apenas quando todas as entidades referenciadas podem ser vinculadas. Se qualquer entidade referenciada não puder ser vinculada, não são reportadas dependências ao nível das colunas e referenced_minor_id é 0. Ver Exemplo D.
referenced_class tinyint Classe da entidade referida.

1 = Objeto ou coluna

6 = Tipo

10 = Coleção de esquemas XML

21 = Função de partição
referenced_class_desc nvarchar(60) Descrição da classe da entidade referenciada.

OBJECT_OR_COLUMN

TYPE

XML_SCHEMA_COLLECTION

PARTITION_FUNCTION
is_caller_dependent bit Indica que a ligação de esquema para a entidade referenciada ocorre em tempo de execução; portanto, a resolução do ID da entidade depende do esquema do chamador. Isto ocorre quando a entidade referenciada é um procedimento armazenado, um procedimento armazenado estendido ou uma função definida pelo utilizador chamada dentro de uma instrução EXECUT.

1 = A entidade referenciada depende do chamador e é resolvida em tempo de execução. Neste caso, referenced_id é NULO.

0 = O ID da entidade referenciada não depende do chamador. Sempre 0 para referências limitadas ao esquema e para referências entre bases de dados e servidores que especificam explicitamente um nome de esquema. Por exemplo, uma referência a uma entidade no formato EXEC MyDatabase.MySchema.MyProc não depende do chamador. No entanto, uma referência no formato EXEC MyDatabase..MyProc depende do chamador.
is_ambiguous bit Indica que a referência é ambígua e pode ser resolvida em tempo de execução para uma função definida pelo utilizador, um tipo definido pelo utilizador (UDT) ou uma referência xquery para uma coluna do tipo xml. Por exemplo, assuma que a instrução SELECT Sales.GetOrder() FROM Sales.MySales está definida num procedimento armazenado. Até que o procedimento armazenado seja executado, não se sabe se Sales.GetOrder() é uma função definida pelo utilizador no Sales esquema ou coluna do tipo Sales UDT com um método chamado GetOrder().

1 = A referência a uma função definida pelo utilizador ou ao método de tipo definido pelo utilizador (UDT) da coluna é ambígua.

0 = A referência é inequívoca ou a entidade pode ser vinculada com sucesso quando a função é chamada.

Sempre 0 para referências ligadas ao esquema.
is_selected bit 1 = O objeto ou coluna é selecionado.
is_updated bit 1 = O objeto ou coluna é modificado.
is_select_all bit 1 = O objeto é usado numa cláusula SELECT * (apenas ao nível do objeto).
is_all_columns_found bit 1 = Todas as dependências de coluna para o objeto podiam ser encontradas.

0 = Dependências de coluna para o objeto não foram encontradas.
is_insert_all bit 1 = O objeto é usado numa instrução INSERT sem lista de colunas (apenas ao nível do objeto).

Esta coluna foi adicionada no SQL Server 2016.
is_incomplete bit 1 = O objeto ou coluna tem um erro de ligação e está incompleto.

Esta coluna foi adicionada no SQL Server 2016 SP2.

Exceptions

Devolve um conjunto de resultados vazio sob qualquer uma das seguintes condições:

  • É especificado um objeto do sistema.

  • A entidade especificada não existe na base de dados atual.

  • A entidade especificada não faz referência a nenhuma entidade.

  • É passado um parâmetro inválido.

Devolve um erro quando a entidade de referência especificada é um procedimento armazenado numerado.

Retorna o erro 2020 quando as dependências das colunas não podem ser resolvidas. Este erro não impede a consulta de devolver dependências ao nível do objeto.

Observações

Esta função pode ser executada no contexto de qualquer base de dados para devolver as entidades que fazem referência a um disparador DDL ao nível do servidor.

A tabela seguinte lista os tipos de entidades para as quais a informação de dependência é criada e mantida. A informação de dependência não é criada nem mantida para regras, predefinidos, tabelas temporárias, procedimentos armazenados temporários ou objetos do sistema.

Tipo de entidade Entidade de referência Entidade referenciada
Table Sim* Yes
View Yes Yes
Transact-SQL procedimento armazenado** Yes Yes
Procedimento armazenado CLR Não Yes
Transact-SQL função definida pelo utilizador Yes Yes
Função definida pelo utilizador CLR Não Yes
Gatilho CLR (DML e DDL) Não Não
Transact-SQL Gatilho DML Yes Não
Transact-SQL gatilho DDL ao nível da base de dados Yes Não
Transact-SQL gatilho DDL ao nível do servidor Yes Não
Procedimentos armazenados ampliados Não Yes
Fila Não Yes
Sinónimo Não Yes
Tipo (alias e tipo CLR definido pelo utilizador) Não Yes
Coleção de esquemas XML Não Yes
Função de partição Não Yes

* Uma tabela é acompanhada como entidade de referência apenas quando faz referência a um módulo Transact-SQL, tipo definido pelo utilizador ou coleção de esquema XML na definição de uma coluna computada, restrição CHECK ou restrição DEFAULT.

** Procedimentos armazenados numerados com valor inteiro superior a 1 não são rastreados nem como entidade referenciada nem como entidade referenciada.

Permissions

Requer permissão SELECT em sys.dm_sql_referenced_entities e permissão VER DEFINIÇÃO na entidade referenciadora. Por defeito, a permissão SELECT é concedida ao público. Requer permissão VIEW DEFINITION na base de dados ou permissão ALTER DATABASE DDL TRIGGER na base de dados quando a entidade referenciadora é um disparador DDL ao nível da base de dados. Requer permissão VER QUALQUER DEFINIÇÃO no servidor quando a entidade referenciadora é um gatilho DDL ao nível do servidor.

Examples

A. Devolve entidades referenciadas por um gatilho DDL ao nível da base de dados

O exemplo seguinte devolve as entidades (tabelas e colunas) que são referenciadas pelo disparador ddlDatabaseTriggerLogDDL ao nível da base de dados .

USE AdventureWorks2022;  
GO  
SELECT
        referenced_schema_name,
        referenced_entity_name,
        referenced_minor_name,
        referenced_minor_id,
        referenced_class_desc
    FROM
        sys.dm_sql_referenced_entities (
            'ddlDatabaseTriggerLog',
            'DATABASE_DDL_TRIGGER')
;
GO  

B. Devolve entidades que são referenciadas por um objeto

O exemplo seguinte devolve as entidades que são referenciadas pela função dbo.ufnGetContactInformationdefinida pelo utilizador .

USE AdventureWorks2022;  
GO  
SELECT
        referenced_schema_name,
        referenced_entity_name,
        referenced_minor_name,
        referenced_minor_id,
        referenced_class_desc,
        is_caller_dependent,
        is_ambiguous
    FROM
        sys.dm_sql_referenced_entities (
            'dbo.ufnGetContactInformation',
            'OBJECT')
;
GO  

C. Retorno de dependências de colunas

O exemplo seguinte cria a tabela Table1 com a coluna c calculada definida como a soma das colunas a e b. A sys.dm_sql_referenced_entities vista é então chamada. A vista devolve duas linhas, uma para cada coluna definida na coluna computada.

CREATE TABLE dbo.Table1 (a int, b int, c AS a + b);  
GO  
SELECT
        referenced_schema_name AS schema_name,  
        referenced_entity_name AS table_name,  
        referenced_minor_name  AS referenced_column,  
        COALESCE(
            COL_NAME(OBJECT_ID(N'dbo.Table1'),
            referencing_minor_id),
            'N/A') AS referencing_column_name  
    FROM
        sys.dm_sql_referenced_entities ('dbo.Table1', 'OBJECT')
;
GO

-- Remove the table.  
DROP TABLE dbo.Table1;  
GO  

Aqui está o conjunto de resultados.

schema_name table_name referenced_column referencing_column  
----------- ---------- ----------------- ------------------  
dbo         Table1     a                 c  
dbo         Table1     b                 c  

D. Devolver dependências de colunas não limitadas pelo esquema

O exemplo seguinte elimina Table1 e cria Table2 um procedimento Proc1armazenado . O procedimento faz referência Table2 e a tabela Table1inexistente . A visualização sys.dm_sql_referenced_entities é executada com o procedimento armazenado especificado como entidade referenciadora. O conjunto de resultados mostra uma linha para Table1 e 3 linhas para Table2. Como Table1 não existe, as dependências das colunas não podem ser resolvidas e o erro 2020 é devolvido. A is_all_columns_found coluna devolve 0 para Table1 indicar que havia colunas que não puderam ser descobertas.

DROP TABLE IF EXISTS dbo.Table1;
GO  
CREATE TABLE dbo.Table2 (c1 int, c2 int);  
GO  
CREATE PROCEDURE dbo.Proc1 AS  
    SELECT a, b, c FROM Table1;  
    SELECT c1, c2 FROM Table2;  
GO  
SELECT
        referenced_id,
        referenced_entity_name AS table_name,
        referenced_minor_name  AS referenced_column_name,
        is_all_columns_found
    FROM
        sys.dm_sql_referenced_entities ('dbo.Proc1', 'OBJECT');
GO  

Aqui está o conjunto de resultados.

referenced_id table_name   referenced_column_name  is_all_columns_found  
------------- ------------ ----------------------- --------------------  
935674381     Table2       NULL                    1  
935674381     Table2       C1                      1  
935674381     Table2       C2                      1  
NULL          Table1       NULL                    0  

Msg 2020, Level 16, State 1, Line 1
The dependencies reported for entity "dbo.Proc1" might not include
 references to all columns. This is either because the entity
 references an object that does not exist or because of an error
 in one or more statements in the entity.  Before rerunning the
 query, ensure that there are no errors in the entity and that
 all objects referenced by the entity exist.

E. Demonstração de manutenção dinâmica de dependências

Este Exemplo E assume que o Exemplo D foi executado. O exemplo E mostra que as dependências são mantidas dinamicamente. O exemplo faz as seguintes coisas:

  1. Recria Table1, que foi eliminado no Exemplo D.
  2. Run Then sys.dm_sql_referenced_entities é executado novamente com o procedimento armazenado especificado como entidade referenciadora.

O conjunto de resultados mostra que ambas as tabelas, e as respetivas colunas definidas no procedimento armazenado, são retornadas. Além disso, a is_all_columns_found coluna devolve um 1 para todos os objetos e colunas.

CREATE TABLE Table1 (a int, b int, c AS a + b);  
GO   
SELECT
        referenced_id,
        referenced_entity_name AS table_name,
        referenced_minor_name  AS column_name,
        is_all_columns_found
    FROM
        sys.dm_sql_referenced_entities ('dbo.Proc1', 'OBJECT');
GO  
DROP TABLE Table1, Table2;  
DROP PROC Proc1;  
GO  

Aqui está o conjunto de resultados.

referenced_id table_name   referenced_column_name  is_all_columns_found  
------------- ------------ ----------------------- --------------------  
935674381     Table2       NULL                    1 
935674381     Table2       c1                      1 
935674381     Table2       c2                      1 
967674495     Table1       NULL                    1 
967674495     Table1       a                       1  
967674495     Table1       b                       1  
967674495     Table1       c                       1  

F. Devolução do uso de objetos ou colunas

O exemplo seguinte devolve os objetos e dependências das colunas do procedimento HumanResources.uspUpdateEmployeePersonalInfoarmazenado . Este procedimento atualiza NationalIDNumberas colunas , BirthDate,``MaritalStatus, e Gender da Employee tabela com base num valor especificado BusinessEntityID . Outro procedimento armazenado upsLogError está definido num TRY... CATCH para capturar quaisquer erros de execução. As is_selectedcolunas , is_updated, e is_select_all retornam informação sobre como estes objetos e colunas são usados dentro do objeto referenciador. A tabela e as colunas que são modificadas são indicadas por um 1 na coluna is_updated. A BusinessEntityID coluna é apenas selecionada e o procedimento uspLogError armazenado não é selecionado nem modificado.

USE AdventureWorks2022;
GO
SELECT
        referenced_entity_name AS table_name,
        referenced_minor_name  AS column_name,
        is_selected,  is_updated,  is_select_all
    FROM
        sys.dm_sql_referenced_entities(
            'HumanResources.uspUpdateEmployeePersonalInfo',
            'OBJECT')
;

Aqui está o conjunto de resultados.

table_name    column_name         is_selected is_updated is_select_all  
------------- ------------------- ----------- ---------- -------------  
uspLogError   NULL                0           0          0  
Employee      NULL                0           1          0  
Employee      BusinessEntityID    1           0          0  
Employee      NationalIDNumber    0           1          0  
Employee      BirthDate           0           1          0  
Employee      MaritalStatus       0           1          0  
Employee      Gender              0           1          0

Ver também

sys.dm_sql_referencing_entities (Transact-SQL)
sys.sql_dependências_expressões (Transact-SQL)