sys.dm_sql_referenced_entities(Transact-SQL)

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

SQL Server에서 지정된 참조 엔터티 정의에서 이름으로 참조되는 각 사용자 정의 엔터티에 대해 하나의 행을 반환합니다. 참조된 엔터티라고 하는 하나의 사용자 정의 엔터티가 참조하는 엔터티라고 하는 다른 사용자 정의 엔터티의 지속형 SQL 식에 이름으로 나타날 때 두 엔터티 간의 종속성이 만들어집니다. 예를 들어 저장 프로시저가 지정된 참조 엔터티인 경우 이 함수는 테이블, 뷰, UT(사용자 정의 형식) 또는 기타 저장 프로시저와 같은 저장 프로시저에서 참조되는 모든 사용자 정의 엔터티를 반환합니다.

이 동적 관리 함수를 사용하여 지정된 참조 엔터티에서 참조하는 다음 유형의 엔터티를 보고할 수 있습니다.

  • 스키마 바인딩된 엔터티

  • 스키마 바인딩되지 않은 엔터티

  • 데이터베이스 간 및 서버 간 엔터티

  • 스키마 바인딩된 엔터티 및 비 스키마 바인딩된 엔터티에 대한 열 수준 종속성

  • 사용자 정의 형식(별칭 및 CLR UDT)

  • XML 스키마 컬렉션

  • 파티션 함수

구문

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

인수

[ schema_name. ] referencing_entity_name
참조 엔터티의 이름입니다. 참조 클래스가 OBJECT인 경우 schema_name 필요합니다.

schema_name.referencing_entity_name은 nvarchar(517)입니다.

<> referencing_class ::= { OBJECT | DATABASE_DDL_TRIGGER | SERVER_DDL_TRIGGER }
지정된 참조 엔터티의 클래스입니다. 각 문에는 하나의 클래스만 지정할 수 있습니다.

<> referencing_class nvarchar(60)입니다.

반환된 테이블

열 이름 데이터 형식 설명
referencing_minor_id int 참조 엔터티가 열인 경우 열 ID입니다. 그렇지 않으면 0입니다. Null을 허용하지 않습니다.
referenced_server_name sysname 참조된 엔터티의 서버 이름입니다.

이 열은 유효한 4부로 구성된 이름을 지정하여 만들어진 서버 간 종속성에 대해 채워집니다. 다중 파트 이름에 대한 자세한 내용은 Transact-SQL 구문 규칙을 참조 하세요.

네 부분으로 구성된 이름을 지정하지 않고 엔터티를 참조한 스키마 바인딩되지 않은 종속성에 대한 NULL입니다.

스키마 바인딩된 엔터티는 동일한 데이터베이스에 있어야 하므로 두 부분으로 구성된(schema.object) 이름을 사용하여 정의할 수 있기 때문에 NULL입니다.
referenced_database_name sysname 참조된 엔터티의 데이터베이스 이름입니다.

이 열은 유효한 3부 또는 4부로 구성된 이름을 지정하여 만들어진 데이터베이스 간 또는 서버 간 참조에 대해 채워집니다.

한 부분 또는 두 부분으로 된 이름을 사용하여 지정된 비스키마 바운드 참조의 경우 NULL입니다.

스키마 바인딩된 엔터티는 동일한 데이터베이스에 있어야 하므로 두 부분으로 구성된(schema.object) 이름을 사용하여 정의할 수 있기 때문에 NULL입니다.
referenced_schema_name sysname 참조된 엔터티가 속한 스키마입니다.

스키마 이름을 지정하지 않고 엔터티를 참조한 스키마 바인딩되지 않은 참조의 경우 NULL입니다.

스키마 바운드 참조의 경우 NULL이 안 됩니다.
referenced_entity_name sysname 참조된 엔터티의 이름입니다. Null을 허용하지 않습니다.
referenced_minor_name sysname 참조된 엔터티가 열인 경우 열 이름입니다. 그렇지 않으면 NULL입니다. 예를 들어 referenced_minor_name 참조된 엔터티 자체를 나열하는 행의 NULL입니다.

참조된 엔터티는 열이 참조하는 엔터티의 이름으로 식별되거나 부모 엔터티가 SELECT * 문에서 사용되는 경우 열입니다.
referenced_id int 참조된 엔터티의 ID입니다. referenced_minor_id 0이 아닌 경우 referenced_id 열이 정의된 엔터티입니다.

서버 간 참조의 경우 항상 NULL입니다.

데이터베이스가 오프라인이거나 엔터티를 바인딩할 수 없기 때문에 ID를 확인할 수 없는 경우 데이터베이스 간 참조의 경우 NULL입니다.

ID를 확인할 수 없는 경우 데이터베이스 내의 참조에 대한 NULL입니다. 스키마 바인딩되지 않은 참조의 경우 참조된 엔터티가 데이터베이스에 없거나 이름 확인이 호출자에 종속된 경우 ID를 확인할 수 없습니다. 후자의 경우 is_caller_dependent 1로 설정됩니다.

스키마 바운드 참조의 경우 NULL이 안 됩니다.
referenced_minor_id int 참조된 엔터티가 열인 경우 열 ID이며 그렇지 않은 경우 0입니다. 예를 들어 referenced_minor_is 참조된 엔터티 자체를 나열하는 행에서 0입니다.

스키마 바인딩되지 않은 참조의 경우 열 종속성은 참조된 모든 엔터티를 바인딩할 수 있는 경우에만 보고됩니다. 참조된 엔터티를 바인딩할 수 없는 경우 열 수준 종속성이 보고되지 않고 referenced_minor_id 0입니다. 예 4를 참조하십시오.
referenced_class tinyint 참조된 엔터티의 클래스입니다.

1 = 개체 또는 열

6 = 형식

10 = XML 스키마 컬렉션

21 = Partition 함수
referenced_class_desc nvarchar(60) 참조된 엔터티 클래스에 대한 설명입니다.

OBJECT_OR_COLUMN

TYPE

XML_SCHEMA_COLLECTION

PARTITION_FUNCTION
is_caller_dependent bit 참조된 엔터티에 대한 스키마 바인딩이 런타임에 발생했음을 나타냅니다. 따라서 엔터티 ID의 확인은 호출자의 스키마에 따라 달라집니다. 이는 참조된 엔터티가 EXECUTE 문 내에서 호출된 저장 프로시저, 확장 저장 프로시저 또는 사용자 정의 함수일 때 발생합니다.

1 = 참조된 엔터티는 호출자에 종속되며 런타임에 확인됩니다. 이 경우 referenced_id NULL입니다.

0 = 참조된 엔터티 ID가 호출자에 종속되지 않습니다. 스키마 이름을 명시적으로 지정하는 스키마 바운드 참조와 데이터베이스 간 및 서버 간 참조의 경우 항상 0입니다. 예를 들어 형식 EXEC MyDatabase.MySchema.MyProc 의 엔터티에 대한 참조는 호출자에 종속되지 않습니다. 그러나 형식 EXEC MyDatabase..MyProc 의 참조는 호출자에 따라 다릅니다.
is_ambiguous bit 참조가 모호하며 런타임에 사용자 정의 함수, UDT(사용자 정의 형식) 또는 xml 형식 열에 대한 xquery 참조로 확인할 수 있음을 나타냅니다. 예를 들어 저장 프로시저에 SELECT Sales.GetOrder() FROM Sales.MySales 문이 정의된 경우 저장 프로시저가 실행될 때까지 스키마의 사용자 정의 함수인지 또는 이름이 지정된 GetOrder()메서드가 있는 Sales UDT 형식의 열 Sales 인지 Sales.GetOrder() 알 수 없습니다.

1 = 사용자 정의 함수 또는 열 UDT(사용자 정의 형식) 메서드에 대한 참조가 모호합니다.

0 = 참조가 분명하거나 함수가 호출될 때 엔터티를 성공적으로 바인딩할 수 있습니다.

스키마 바인딩 참조의 경우 항상 0입니다.
is_selected bit 1 = 개체 또는 열이 선택되어 있습니다.
is_updated bit 1 = 개체 또는 열이 수정되었습니다.
is_select_all bit 1 = 개체가 SELECT * 절에 사용됩니다(개체 수준만 해당).
is_all_columns_found bit 1 = 개체에 대한 모든 열 종속성을 찾을 수 있습니다.

0 = 개체에 대한 열 종속성을 찾을 수 없습니다.
is_insert_all bit 1 = 개체가 열 목록 없이 INSERT 문에 사용됩니다(개체 수준에만 해당).

이 열은 SQL Server 2016에 추가되었습니다.
is_incomplete bit 1 = 개체 또는 열에 바인딩 오류가 있고 불완전합니다.

이 열은 SQL Server 2016 SP2에 추가되었습니다.

예외

다음 조건 중에서 빈 결과 집합을 반환합니다.

  • 시스템 개체가 지정됩니다.

  • 지정된 엔터티가 현재 데이터베이스에 없습니다.

  • 지정된 엔터티는 엔터티를 참조하지 않습니다.

  • 잘못된 매개 변수가 전달되었습니다.

지정된 참조 엔터티가 번호가 매겨진 저장 프로시저인 경우 오류를 반환합니다.

열 종속성을 확인할 수 없는 경우 오류 2020을 반환합니다. 이 오류는 쿼리가 개체 수준 종속성을 반환하는 것을 방지하지 않습니다.

설명

이 함수는 모든 데이터베이스의 컨텍스트에서 실행하여 서버 수준 DDL 트리거를 참조하는 엔터티를 반환할 수 있습니다.

다음 표에서는 종속성 정보를 만들고 유지 관리하는 엔터티 유형을 나열합니다. 종속성 정보는 규칙, 기본값, 임시 테이블, 임시 저장 프로시저 또는 시스템 개체에 대해 생성되거나 유지 관리되지 않습니다.

엔터티 형식 엔터티 참조 참조된 엔터티
테이블 예*
보기
Transact-SQL 저장 프로시저**
CLR 저장 프로시저 없음
Transact-SQL 사용자 정의 함수
CLR 사용자 정의 함수 없음
CLR 트리거(DML 및 DDL) 없음 없음
Transact-SQL DML 트리거 없음
Transact-SQL 데이터베이스 수준 DDL 트리거 없음
Transact-SQL 서버 수준 DDL 트리거 없음
확장된 저장 프로시저 없음
없음
동의어 없음
형식(별칭 및 CLR 사용자 정의 형식) 없음
XML 스키마 컬렉션 없음
파티션 함수 없음

* 테이블은 계산 열, CHECK 제약 조건 또는 DEFAULT 제약 조건 정의에서 Transact-SQL 모듈, 사용자 정의 형식 또는 XML 스키마 컬렉션을 참조하는 경우에만 참조 엔터티로 추적됩니다.

** 정수 값이 1보다 큰 번호가 매겨진 저장 프로시저는 참조 또는 참조된 엔터티로 추적되지 않습니다.

사용 권한

sys.dm_sql_referenced_entities에 대한 SELECT 권한 및 참조 엔터티에 대한 VIEW DEFINITION 권한이 필요합니다. 기본적으로 SELECT 권한은 공용에 부여됩니다. 참조하는 엔터티가 데이터베이스 수준 DDL 트리거인 경우 데이터베이스에 대한 VIEW DEFINITION 권한 또는 데이터베이스에 대한 ALTER DATABASE DDL TRIGGER 권한이 필요합니다. 참조 엔터티가 서버 수준 DDL 트리거인 경우 서버에 대한 VIEW ANY DEFINITION 권한이 필요합니다.

A. 데이터베이스 수준 DDL 트리거에서 참조하는 엔터티 반환

다음 예에서는 데이터베이스 수준 DDL 트리거 ddlDatabaseTriggerLog에 의해 참조되는 엔터티(테이블 및 열)를 반환합니다.

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. 개체에서 참조하는 엔터티 반환

다음 예제에서는 사용자 정의 함수 dbo.ufnGetContactInformation에서 참조하는 엔터티를 반환합니다.

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. 열 종속성 반환

다음 예에서는 Table1 열과 c 열의 합계로 정의되는 계산 열 a가 포함된 b 테이블을 만듭니다. 그런 다음 sys.dm_sql_referenced_entities 뷰를 호출합니다. 이 뷰는 계산 열에 정의된 각 열에 대해 하나씩 두 개의 행을 반환합니다.

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  

결과 집합은 다음과 같습니다.

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

D. 스키마 바인딩되지 않은 열 종속성 반환

다음 예제에서는 프로시저를 삭제 Table1 하고 만들고 Table2 저장합니다 Proc1. 프로시저가 참조하고 Table2 존재하지 않는 테이블 Table1입니다. 저장 프로시저가 참조 엔터티로 지정되어 sys.dm_sql_referenced_entities 뷰가 실행됩니다. 결과 집합에는 행 1개 Table1 와 행 3개를 표시합니다 Table2. Table1이 없기 때문에 열 종속성을 확인할 수 없고 오류 2020이 반환됩니다. 이 열은 is_all_columns_found 검색할 수 없는 열이 있음을 나타내는 0 Table1 을 반환합니다.

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  

결과 집합은 다음과 같습니다.

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. 동적 종속성 유지 관리 시연

이 예제 E에서는 예제 D가 실행되었다고 가정합니다. E 예제에서는 종속성이 동적으로 유지 관리됨을 보여 줍니다. 이 예제에서는 다음 작업을 수행합니다.

  1. 예제 D에서 삭제된 다시 만듭니다 Table1.
  2. Run Then sys.dm_sql_referenced_entities 은 참조하는 엔터티로 지정된 저장 프로시저를 사용하여 다시 실행됩니다.

결과 집합은 저장 프로시저에 정의된 테이블과 해당 열이 모두 반환됨을 보여 줍니다. 또한 열은 is_all_columns_found 모든 개체 및 열에 대해 1을 반환합니다.

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  

결과 집합은 다음과 같습니다.

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. 개체 또는 열 사용량 반환

다음 예제에서는 저장 프로시저 HumanResources.uspUpdateEmployeePersonalInfo의 개체 및 열 종속성을 반환합니다. 이 프로시저는 지정된 BusinessEntityID 값에 따라 테이블의 EmployeeNationalIDNumberBirthDate,``MaritalStatusGender 테이블을 업데이트합니다. 다른 저장 프로시저 upsLogError 는 TRY에 정의되어 있습니다... 실행 오류를 캡처하는 CATCH 블록입니다. is_selected, is_updatedis_select_all 열은 참조하는 개체 내에 이러한 개체 및 열이 사용되는 방식에 대한 정보를 반환합니다. 수정된 테이블과 열은 is_updated 열의 1로 표시됩니다. 열은 BusinessEntityID 선택만 하고 저장 프로시저 uspLogError 는 선택하거나 수정하지 않습니다.

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')
;

결과 집합은 다음과 같습니다.

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

참고 항목

sys.dm_sql_referencing_entities(Transact-SQL)
sys.sql_expression_dependencies(Transact-SQL)