Compartilhar via


sys.sql_expression_dependencies (Transact-SQL)

Contém uma linha para cada dependência por nome em uma entidade definida pelo usuário no banco de dados atual. A dependência entre duas entidades é criada quando uma entidade, denominada entidade referenciada, aparece por nome em uma expressão SQL persistente de outra entidade, denominada entidade de referência. Por exemplo, quando uma tabela for referenciada na definição de uma exibição, a exibição, como a entidade de referência, dependerá da tabela, a entidade referenciada. Se a tabela for descartada, a exibição será inutilizável.

Você pode usar essa exibição do catálogo para relatar informações de dependência das seguintes entidades:

  • Entidades associadas a esquema

  • Entidades não associadas a esquema.

  • Entidades entre banco de dados e entre servidores. São relatados os nomes de entidade; porém, os IDs da entidade não são solucionados.

  • Dependências de coluna em entidades associadas a esquema. As dependências em nível de coluna para objetos não associados a esquema podem ser retornadas usando sys.dm_sql_referenced_entities.

  • A DDL no nível de servidor é disparada quando está no contexto do banco de dados mestre.

Nome da coluna

Tipo de dados

Descrição

referencing_id

int

ID da entidade de referência. Não permite valor nulo.

referencing_minor_id

int

ID da coluna quando a entidade de referência for uma coluna; caso contrário, 0. Não permite valor nulo.

referencing_class

tinyint

Classe da entidade de referência.

1 = Objeto ou coluna

12 = Gatilho DDL do banco de dados

13 - Gatilho DDL do servidor

Não permite valor nulo.

referencing_class_desc

nvarchar(60)

Descrição da classe da entidade de referência.

OBJECT_OR_COLUMN

DATABASE_DDL_TRIGGER

SERVER_DDL_TRIGGER

Não permite valor nulo.

is_schema_bound_reference

bit

1 = A entidade referenciada é associada a esquema.

0 = A entidade referenciada não é associada a esquema.

Não permite valor nulo.

referenced_class

tinyint

Classe da entidade referenciada.

1 = Objeto ou coluna

6 = Tipo

10 = Coleção de esquema XML

21 = Função de partição

Não permite valor nulo.

referenced_class_desc

nvarchar(60)

Descrição de classe da entidade referenciada.

OBJECT_OR_COLUMN

TYPE

XML_SCHEMA_COLLECTION

PARTITION_FUNCTION

Não permite valor nulo.

referenced_server_name

sysname

Nome do servidor da entidade referenciada.

Essa coluna é populada para dependências entre servidores que são feitas especificando um nome de quatro partes válido. Para obter informações sobre nomes de várias partes, consulte convenções de sintaxe Transact-SQL (Transact-SQL).

NULL para entidades não associadas a esquema para as quais a entidade foi referenciada sem especificar um nome de quatro partes.

NULL para entidades associadas a esquema porque elas devem estar no mesmo banco de dados e, portanto, só podem ser definidas com um nome de duas partes (schema.object).

referenced_database_name

sysname

Nome do banco de dados da entidade referenciada.

Essa coluna é populada para referências entre servidores ou entre bancos de dados, que são feitas especificando um nome de três ou quatro partes válido.

NULL para referências não associadas a esquema quando especificadas usando um nome de uma ou duas partes.

NULL para entidades associadas a esquema porque elas devem estar no mesmo banco de dados e, portanto, só podem ser definidas com um nome de duas partes (schema.object).

referenced_schema_name

sysname

Esquema ao qual a entidade referenciada pertence.

NULL para referências não associadas a esquema para as quais a entidade foi referenciada sem especificar o nome do esquema.

Nunca NULL para referências associadas a esquema porque devem ser definidas entidades associadas a esquema e referenciadas usando um nome de duas partes.

referenced_entity_name

sysname

Nome da entidade referenciada. Não permite valor nulo.

referenced_id

int

ID da entidade referenciada.

Sempre NULL para referências entre servidores e bancos de dados.

NULL para referências dentro do banco de dados se a ID não puder ser determinada. Para referências não associadas a esquema, a ID não pode ser resolvida nos seguintes casos:

  • A entidade referenciada não existe no banco de dados.

  • O esquema da entidade referenciada depende do esquema do chamador e é resolvido em tempo de execução. Nesse caso, is_caller_dependent está definido como 1.

Jamais NULL para referências associadas a esquema.

referenced_minor_id

int

ID da coluna referenciada quando a entidade de referência for uma coluna; caso contrário, 0. Não permite valor nulo.

Uma entidade referenciada é uma coluna quando uma coluna é identificada pelo nome na entidade de referência, ou quando a entidade pai é usada em uma instrução SELECT *.

is_caller_dependent

bit

Indica que a associação de esquema para a entidade referenciada ocorre em tempo de execução; portanto, a resolução da ID da entidade depende do esquema do chamador. Isso ocorre quando a entidade referenciada for um procedimento armazenado, um procedimento armazenado estendido ou uma função definida pelo usuário não associada a esquema chamados em uma instrução EXECUTE.

1 = A entidade referenciada é dependente do chamador e é resolvida em tempo de execução. Nesse caso, referenced_id é NULL.

0 = A ID da entidade referenciada não é dependente do chamador.

Sempre 0 para referências associadas a esquema e referências entre bancos de dados e entre servidores que especificam explicitamente um nome de esquema. Por exemplo, uma referência para uma entidade no formato EXEC MyDatabase.MySchema.MyProc não é dependente do chamador. Porém, uma referência no formato EXEC MyDatabase..MyProc é dependente 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 usuário, um UDT (Tipo Definido pelo Usuário) ou uma referência xquery para uma coluna do tipo xml.

Por exemplo, suponha que a instrução SELECT Sales.GetOrder() FROM Sales.MySales esteja definida em um procedimento armazenado. Até que o procedimento armazenado seja executado, não se sabe se Sales.GetOrder() é uma função definida pelo usuário no esquema Sales ou é uma coluna denominada Sales do tipo UDT com um método denominado GetOrder().

1 = A referência é ambígua.

0 = A referência não é ambígua ou a entidade pode ser associada com êxito quando a exibição é chamada.

Sempre 0 para referências associadas a esquema.

Comentários

A tabela a seguir lista os tipos de entidades para os quais as informações de dependência são criadas e mantidas. As informações de dependência não são criadas nem mantidas para regras, padrões, tabelas temporárias, procedimentos armazenados temporários ou objetos do sistema.

Tipo de entidade

Entidade de referência

Entidade referenciada

Tabela

Sim*

Sim

Exibição

Sim

Sim

Índice filtrado

Sim**

Não

Estatísticas filtradas

Sim**

Não

Procedimento armazenado Transact-SQL***

Sim

Sim

Procedimento armazenado CLR

Não

Sim

Função Transact-SQL definida pelo usuário

Sim

Sim

Função CLR definida pelo usuário

Não

Sim

Gatilho CLR (DML e DDL)

Não

Não

Gatilho DML Transact-SQL

Sim

Não

Gatilho DDL no nível do banco de dados Transact-SQL

Sim

Não

Gatilho DDL no nível do servidor Transact-SQL

Sim

Não

Procedimentos armazenados estendidos

Não

Sim

Fila

Não

Sim

Sinônimo

Não

Sim

Tipo (alias e tipo de dados CLR definido pelo usuário)

Não

Sim

Coleção de esquemas XML

Não

Sim

Função de partição

Não

Sim

* Uma tabela é controlada como entidade de referência apenas quando se refere a um módulo Transact-SQL, tipo definido pelo usuário ou coleção de esquemas XML na definição de uma coluna computada, restrição CHECK ou restrição DEFAULT.

* * Cada coluna usada no predicado de filtro é controlada como uma entidade de referência.

*** Procedimentos armazenados numerados com valor inteiro maior que 1 não são controlados, nem como entidade de referência nem como entidade referenciada.

Para obter mais informações, consulte Compreendendo dependências do SQL.

Permissões

Requer permissão VIEW DEFINITION no banco de dados e permissão SELECT em sys.sql_expression_dependencies para o banco de dados. Por padrão, a permissão SELECT é concedida somente a membros da função de banco de dados fixa db_owner. Quando são concedidas permissões SELECT e VIEW DEFINITION a outro usuário, o usuário autorizado pode exibir todas as dependências no banco de dados.

Exemplos

A. Retornando entidades referenciadas por outra entidade

O exemplo a seguir retorna as tabelas e colunas referenciadas na exibição Production.vProductAndDescription. A exibição depende das entidades (tabelas e colunas) retornadas nas colunas referenced_entity_name e referenced_column_name.

USE AdventureWorks2008R2;
GO
SELECT OBJECT_NAME(referencing_id) AS referencing_entity_name, 
    o.type_desc AS referencing_desciption, 
    COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS referencing_minor_id, 
    referencing_class_desc, referenced_class_desc,
    referenced_server_name, referenced_database_name, referenced_schema_name,
    referenced_entity_name, 
    COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS referenced_column_name,
    is_caller_dependent, is_ambiguous
FROM sys.sql_expression_dependencies AS sed
INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id
WHERE referencing_id = OBJECT_ID(N'Production.vProductAndDescription');
GO

B. Retornando entidades que referenciam outra entidade

O exemplo a seguir retorna as entidades que referenciam a tabela Production.Product. As entidades retornadas na coluna referencing_entity_name dependem da tabela Product.

USE AdventureWorks2008R2;
GO
SELECT OBJECT_SCHEMA_NAME ( referencing_id ) AS referencing_schema_name,
    OBJECT_NAME(referencing_id) AS referencing_entity_name, 
    o.type_desc AS referencing_desciption, 
    COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS referencing_minor_id, 
    referencing_class_desc, referenced_class_desc,
    referenced_server_name, referenced_database_name, referenced_schema_name,
    referenced_entity_name, 
    COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS referenced_column_name,
    is_caller_dependent, is_ambiguous
FROM sys.sql_expression_dependencies AS sed
INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id
WHERE referenced_id = OBJECT_ID(N'Production.Product');
GO

C. Retornando dependências entre bancos de dados

O exemplo a seguir retorna todas as dependências entre banco de dados. O exemplo cria primeiramente um banco de dados db1 e dois procedimentos armazenados que referenciam tabelas dos bancos de dados db2 e db3. A tabela sys.sql_expression_dependencies é consultada em seguida, para relatar as dependências entre bancos de dados existentes entre procedimentos e tabelas. Observe que NULL é retornado na coluna referenced_schema_name para a entidade referenciada t3 porque o nome de esquema daquela entidade não foi especificado na definição do procedimento.

CREATE DATABASE db1;
GO
USE db1;
GO
CREATE PROCEDURE p1 AS SELECT * FROM db2.s1.t1;
GO
CREATE PROCEDURE p2 AS
    UPDATE db3..t3
    SET c1 = c1 + 1;
GO
SELECT OBJECT_NAME (referencing_id),referenced_database_name, 
    referenced_schema_name, referenced_entity_name
FROM sys.sql_expression_dependencies
WHERE referenced_database_name IS NOT NULL;
GO
USE master;
GO
DROP DATABASE db1;
GO