次の方法で共有


sys.dm_sql_referenced_entities (Transact-SQL)

指定された参照元エンティティの定義の中で、名前により参照された各ユーザー定義エンティティについて、対応する 1 行を返します。2 つのエンティティ間の依存関係は、一方のユーザー定義エンティティ (参照先エンティティ) の名前が、もう一方のユーザー定義エンティティ (参照元エンティティ) の保存されている 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
    参照元エンティティの名前です。参照元のクラスが OBJECT の場合、schema_name は必須です。

    schema_name.referencing_entity_name のデータ型は nvarchar(517) です。

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

    <referencing_class> のデータ型は nvarchar(60) です。

返されるテーブル

列名

データ型

説明

referencing_minor_id

int

参照元エンティティが列の場合は列 ID。それ以外の場合は 0。NULL 値は許可されません。

referenced_server_name

sysname

参照先エンティティのサーバー名。

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

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

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

referenced_database_name

sysname

参照先エンティティのデータベース名。

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

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

スキーマ バインド エンティティの場合は 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。

データベース内の参照で ID を判別できない場合は、NULL。非スキーマ バインド参照では、次の場合に 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 スキーマ内のユーザー定義関数なのか、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 スキーマ コレクション

不可

パーティション関数

不可

* テーブルは、Transact-SQL モジュール、ユーザー定義型、XML スキーマ コレクション (計算列の定義内)、CHECK 制約、DEFAULT 制約のいずれかを参照する場合にのみ、参照元エンティティとして追跡されます。

** 1 より大きな整数値を持つ番号付きストアド プロシージャは、参照元エンティティとしても、参照先エンティティとしても追跡されません。

詳細については、「SQL の依存関係について」を参照してください。

権限

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 AdventureWorks2008R2;
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 AdventureWorks2008R2;
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. 列の依存関係を取得する

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

USE AdventureWorks2008R2;
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

D. 非スキーマ バインド列の依存関係を取得する

次の例では、Table1 を削除し、Table2 およびストアド プロシージャ Proc1 を作成します。このプロシージャは、Table2 および存在しないテーブル Table1 を参照します。ビュー sys.dm_sql_referenced_entities は、参照元エンティティとして指定されたストアド プロシージャで実行されます。結果セットには、Table1 および Table2 に対応する 1 行があります。Table1 は存在しないので、列の依存関係が解決されず、エラー 2020 が返されます。

USE AdventureWorks2008R2;
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

E. 依存関係の動的管理

次の例は、例 D を一歩進めて、依存関係を動的に管理する方法を示しています。この例では、まず、例 D で削除した Table1 を作成し直しています。次に、参照元エンティティとして指定されたストアド プロシージャで sys.dm_sql_referenced_entities を再度実行します。結果セットを見ると、両方のテーブルのほか、ストアド プロシージャ内で定義された各列が返されていることがわかります。

USE AdventureWorks2008R2;
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