sys.dm_sql_referenced_entities (Transact-SQL)

適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance

SQL Server で指定した参照元エンティティの定義で、名前によって参照されるユーザー定義エンティティごとに 1 行を返します。 2 つのエンティティ間の依存関係は、 参照エンティティと呼ばれる 1 つのユーザー定義エンティティが、 参照エンティティと呼ばれる別のユーザー定義エンティティの永続化された 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_namenvarchar(517)です。

<referencing_class> ::= { OBJECT |DATABASE_DDL_TRIGGER |SERVER_DDL_TRIGGER }
指定された参照元エンティティのクラスです。 ステートメントごとに指定できるクラスは 1 つだけです。

<referencing_class>nvarchar(60)です。

返されるテーブル

列名 データ型 説明
referencing_minor_id int 参照元エンティティが列の場合は列 ID。それ以外の場合は 0。 NULL 値は許可されません。
referenced_server_name sysname 参照先エンティティのサーバー名。

この列には、有効な 4 部構成の名前を指定することによって作成された複数サーバーにまたがる依存関係が格納されます。 マルチパート名の詳細については、「Transact-SQL 構文表記規則」を参照してください。

4 部構成の名前を指定せずにエンティティが参照された、スキーマ バインドされていない依存関係の場合は NULL。

スキーマ バインド エンティティの場合は NULL。これらは同じデータベースに存在する必要があるため、2 部構成 (schema.object) の名前だけで定義できます。
referenced_database_name sysname 参照先エンティティのデータベース名。

有効な 3 部構成または 4 部構成の名前を指定することによって作成された複数データベースまたは複数サーバーにまたがる参照については、この列に値が格納されます。

非スキーマ バインド参照の場合は NULL (1 部または 2 部構成の名前を使用して指定されるとき)。

スキーマ バインド エンティティの場合は NULL。これらは同じデータベースに存在する必要があるため、2 部構成 (schema.object) の名前だけで定義できます。
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。

データベース内の参照の場合は NULL (ID が判別できない場合)。 スキーマ バインド以外の参照の場合、参照先エンティティがデータベースに存在しない場合、または名前解決が呼び出し元に依存している場合、ID を解決できません。 後者の場合、is_caller_dependentは 1 に設定されます。

スキーマ バインド参照の場合は NULL を使用しません。
referenced_minor_id int 参照先エンティティが列の場合は列 ID。それ以外の場合は 0。 たとえば、参照先エンティティ自体を一覧表示する行では、referenced_minor_id は 0 になります。

スキーマ バインドされていない参照の場合、列の依存関係は、参照されているすべてのエンティティをバインドできる場合にのみ報告されます。 バインドできない参照先エンティティが 1 つでも存在した場合、列レベルの依存関係は報告されず、referenced_minor_id は 0 になります。 例 D を参照してください。
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 スキーマ内のユーザー定義関数なのか、Sales という名前のメソッドを持つ UDT 型の 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 ストアド プロシージャ (CLR stored procedure) いいえ はい
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 権限が public に与えられます。 参照元エンティティがデータベース レベルの 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: 列の依存関係を返す

次の例では、計算列cabの合計として定義されたテーブル Table1を作成します。 その後、sys.dm_sql_referenced_entities ビューが呼び出されます。 このビューは、2 つの行 (計算列で定義された各列につき 1 行) を返します。

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 は、参照元エンティティとして指定されたストアド プロシージャで実行されます。 結果セットには、Table1 に対する 1 行と Table2 に対する 3 行があります。 Table1が存在しないため、列の依存関係を解決できず、エラー 2020 が返されます。 is_all_columns_found 列の Table1 に対する 0 は、検出できなかった列があることを示します。

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. 次に実行 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値に基づいて、Employee テーブルの列NationalIDNumberBirthDate,``MaritalStatus、およびGenderを更新します。 もう 1 つのストアド プロシージャ upsLogError TRY で定義されています。..CATCH ブロックを使用して、実行エラーをキャプチャします。 is_selectedis_updated、および is_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)