sys.dm_sql_referenced_entities(Transact-SQL)
지정된 참조 엔터티 정의에서 이름별로 참조되는 각 사용자 정의 엔터티에 대해 하나의 행을 반환합니다. 두 엔터티 간의 종속성은 참조된 엔터티라는 하나의 사용자 정의 엔터티가 참조 엔터티라는 다른 사용자 정의 엔터티의 영구 SQL 식에서 이름별로 나타날 때 생성됩니다. 예를 들어 저장 프로시저가 지정된 참조 엔터티인 경우 이 함수는 테이블, 뷰, UDT(사용자 정의 형식), 또는 다른 저장 프로시저 등 이 저장 프로시저에서 참조되는 모든 사용자 정의 엔터티를 반환합니다.
이러한 동적 관리 함수를 사용하면 지정된 참조 엔터티에 의해 참조되는 다음과 같은 엔터티 유형을 보고할 수 있습니다.
스키마 바운드 엔터티
비스키마 바운드 엔터티
데이터베이스 간 및 서버 간 엔터티
스키마 바운드 엔터티 및 비스키마 바운드 엔터티의 열 수준 종속성
사용자 정의 형식(별칭 및 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
참조 엔터티의 이름입니다. schema_name은 참조 클래스가 OBJECT인 경우에 필요합니다.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 |
참조된 엔터티의 서버 이름입니다. 이 열은 네 부분으로 된 올바른 이름을 지정하여 생성되는 서버 간 종속성에 대해 채워집니다. 다중 부분 이름에 대한 자세한 내용은 Transact-SQL 구문 표기 규칙(Transact-SQL)을 참조하십시오. 네 부분으로 된 이름 지정 없이 엔터티가 참조된 비스키마 바운드 종속성의 경우 NULL입니다. 스키마 바운드 엔터티는 동일한 데이터베이스에 있어야 하므로 두 부분으로 된 이름(schema.object)을 사용해서만 정의될 수 있기 때문에 이러한 엔터티의 경우 NULL입니다. |
referenced_database_name |
sysname |
참조된 엔터티의 데이터베이스 이름입니다. 이 열은 세 부분 또는 네 부분으로 된 올바른 이름을 지정하여 생성되는 데이터베이스 간 또는 서버 간 참조에 대해 채워집니다. 한 부분 또는 두 부분으로 된 이름을 사용하여 지정된 비스키마 바운드 참조의 경우 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를 확인할 수 없습니다.
스키마 바운드 참조의 경우 NULL일 수 없습니다. |
referenced_minor_id |
int |
참조된 엔터티가 열인 경우 열 ID이며 그렇지 않은 경우 0입니다. 예를 들어 참조된 엔터티 자체를 나열하는 행에서 referenced_minor_is는 0입니다. 비스키마 바운드 참조의 경우 모든 참조된 엔터티를 바인딩할 수 있는 경우에만 열 종속성이 보고됩니다. 바인딩할 수 없는 참조된 엔터티가 있는 경우 열 수준 종속성이 보고되지 않으며 referenced_minor_id는 0입니다. 예 4를 참조하십시오. |
referenced_class |
tinyint |
참조된 엔터티의 클래스입니다. 1 = 개체 또는 열 6 = 형식 10 = XML 스키마 컬렉션 21 = 파티션 함수 |
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 문이 정의된 경우 Sales.GetOrder()가 Sales 스키마의 사용자 정의 함수인지, 아니면 GetOrder()라는 메서드가 있는 UDT 형식의 Sales 열인지는 저장 프로시저가 실행될 때까지 알 수 없습니다. 1 = 사용자 정의 함수 또는 열 UDT(사용자 정의 형식) 메서드에 대한 참조가 모호합니다. 0 = 참조가 분명하거나 함수가 호출될 때 엔터티를 성공적으로 바인딩할 수 있습니다. 스키마 바운드 참조의 경우 항상 0입니다. |
예외
다음과 같은 경우 빈 결과 집합을 반환합니다.
시스템 개체가 지정되어 있습니다.
지정된 엔터티가 현재 데이터베이스에 없습니다.
지정된 엔터티가 아무런 엔터티도 참조하지 않습니다.
잘못된 매개 변수가 전달되었습니다.
지정된 참조 엔터티가 번호가 매겨진 저장 프로시저인 경우 오류를 반환합니다.
열 종속성을 확인할 수 없으면 오류 2020을 반환합니다. 이 오류가 발생해도 쿼리는 개체 수준 종속성을 반환합니다. 자세한 내용은 SQL 종속성 문제 해결을 참조하십시오.
주의
이 함수는 데이터베이스 컨텍스트에서 실행되어 서버 수준 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보다 큰 번호가 있는 저장 프로시저는 참조 엔터티나 참조된 엔터티로 추적되지 않습니다.
자세한 내용은 SQL 종속성 이해를 참조하십시오.
사용 권한
sys.dm_sql_referenced_entities에 대한 SELECT 권한 및 참조 엔터티에 대한 VIEW DEFINITION 권한이 필요합니다. 기본적으로 SELECT 권한은 public에 부여됩니다. 참조 엔터티가 데이터 수준 DDL 트리거인 경우 데이터베이스에 대한 ALTER DATABASE DDL TRIGGER 권한 또는 데이터베이스에 대한 VIEW DEFINITION 권한이 필요합니다. 참조 엔터티가 서버 수준 DDL 트리거인 경우 서버에 대한 VIEW ANY DEFINITION 권한이 필요합니다.
예
1. 데이터베이스 수준 DDL 트리거에 의해 참조되는 엔터티 반환
다음 예에서는 데이터베이스 수준 DDL 트리거 ddlDatabaseTriggerLog에 의해 참조되는 엔터티(테이블 및 열)를 반환합니다.
USE AdventureWorks;
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
2. 개체에 의해 참조되는 엔터티 반환
다음 예에서는 사용자 정의 함수 dbo.ufnGetContactInformation에 의해 참조되는 엔터티를 반환합니다.
USE AdventureWorks;
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
3. 열 종속성 반환
다음 예에서는 a 열과 b 열의 합계로 정의되는 계산 열 c가 포함된 테이블 Table1을 만듭니다. 그런 다음 sys.dm_sql_referenced_entities 뷰를 호출합니다. 이 뷰는 계산 열에 정의된 각 열마다 하나씩 두 개의 행을 반환합니다.
USE AdventureWorks;
GO
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
4. 비스키마 바운드 열 종속성 반환
다음 예에서는 Table1을 삭제하고 Table2 및 저장 프로시저 Proc1을 만듭니다. 이 프로시저는 Table2 및 존재하지 않는 테이블 Table1을 참조합니다. 저장 프로시저가 참조 엔터티로 지정되어 뷰 sys.dm_sql_referenced_entities가 실행됩니다. 결과 집합에는 Table1 및 Table2에 대한 행이 하나씩 표시됩니다. Table1이 없기 때문에 열 종속성을 확인할 수 없고 오류 2020이 반환됩니다.
USE AdventureWorks;
GO
IF OBJECT_ID ( 'dbo.Table1', 'U' ) IS NOT NULL
DROP TABLE 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
FROM sys.dm_sql_referenced_entities ('dbo.Proc1', 'OBJECT');
GO
5. 동적 종속성 유지 관리 설명
다음 예에서는 예 4를 확장하여 종속성이 동적으로 유지 관리되고 있음을 보여 줍니다. 먼저 예 4에서 삭제한 Table1을 다시 만듭니다. 그러면 저장 프로시저가 참조 엔터티로 지정되어 sys.dm_sql_referenced_entities가 다시 실행됩니다. 결과 집합은 저장 프로시저에 정의된 테이블 및 해당 열이 모두 반환되었음을 보여 줍니다.
USE AdventureWorks;
GO
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
FROM sys.dm_sql_referenced_entities ('dbo.Proc1', 'OBJECT');
GO
DROP TABLE Table1, Table2;
DROP PROC Proc1;
GO
결과 집합은 다음과 같습니다.
referenced_id, table_name, column_name
------------- ----------- -----------
2139154566 Table1 NULL
2139154566 Table1 a
2139154566 Table1 b
2139154566 Table1 c
2707154552 Table2 NULL
2707154552 Table2 c1
2707154552 Table2 c2
변경 내역
업데이트된 내용 |
---|
주의 섹션에서 "열 종속성은 CLR 테이블 반환 함수에 대해 추적되지 않습니다"라는 문장을 제거했습니다. |
referencing_entity_name 매개 변수의 데이터 형식을 수정했습니다. |