sys.sql_expression_dependencies (Transact-SQL)

ユーザー定義エンティティに対する名前による依存関係ごとに 1 つの行を現在のデータベースに格納します。2 つのエンティティ間の依存関係は、一方のエンティティ (参照先エンティティ) の名前が、もう一方のエンティティ (参照元エンティティ) の保存されている SQL 式の中で参照された場合に形成されます。たとえば、ビューの定義内でテーブルが参照されている場合、参照元エンティティであるビューは、参照先エンティティであるテーブルに依存します。テーブルが削除された場合、ビューは使用できなくなります。

このカタログ ビューを使用すると、次のエンティティについて依存関係情報をレポートできます。

  • スキーマ バインド エンティティ。

  • 非スキーマ バインド エンティティ。

  • 複数のデータベースやサーバーにまたがるエンティティ。エンティティ名はレポートされますが、エンティティ ID は解決されません。

  • スキーマ バインド エンティティの列レベルの依存関係。非スキーマ バインド オブジェクトの列レベルの依存関係を返すには、sys.dm_sql_referenced_entities を使用します。

  • サーバーレベルの DDL トリガ (master データベースのコンテキスト内)。

列名

データ型

説明

referencing_id

int

参照元エンティティの ID。NULL 値は許可されません。

referencing_minor_id

int

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

referencing_class

tinyint

参照元エンティティのクラス。

1 = オブジェクトまたは列

12 = データベース DDL トリガ

13 = サーバー DDL トリガ

NULL 値は許可されません。

referencing_class_desc

nvarchar(60)

参照元エンティティのクラスの説明。

OBJECT_OR_COLUMN

DATABASE_DDL_TRIGGER

SERVER_DDL_TRIGGER

NULL 値は許可されません。

is_schema_bound_reference

bit

1 = 参照先エンティティはスキーマ バインドです。

0 = 参照先エンティティは非スキーマ バインドです。

NULL 値は許可されません。

referenced_class

tinyint

参照先エンティティのクラス。

1 = オブジェクトまたは列

6 = 型

10 = XML スキーマ コレクション

21 = パーティション関数

NULL 値は許可されません。

referenced_class_desc

nvarchar(60)

参照先エンティティのクラスの説明。

OBJECT_OR_COLUMN

TYPE

XML_SCHEMA_COLLECTION

PARTITION_FUNCTION

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。

スキーマ バインド エンティティは 2 つの部分で構成される名前を使用して定義および参照する必要があるので、スキーマ バインド参照の場合、NULL にすることはできません。

referenced_entity_name

sysname

参照先エンティティの名前。NULL 値は許可されません。

referenced_id

int

参照先エンティティの ID。

サーバー間参照やデータベース間参照の場合は常に NULL です。

データベース内の参照で ID を判別できない場合は、NULL。非スキーマ バインド参照では、次の場合に ID を解決できません。

  • 参照先エンティティがデータベースに存在しない。

  • 参照先エンティティのスキーマが呼び出し元に依存し、実行時に解決される。この場合、is_caller_dependent は 1 に設定されます。

スキーマ バインド参照の場合、NULL にすることはできません。

referenced_minor_id

int

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

参照元エンティティの中で列が名前で指定されていた場合、または、SELECT * ステートメントの中で親エンティティが使用されていた場合、参照先エンティティは列になります。

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 = 参照はあいまいです。

0 = 参照は明確です。つまり、ビューを呼び出したときに、エンティティを正しくバインドできます。

スキーマ バインド参照の場合は常に 0 になります。

説明

次の表に、依存関係情報が作成および管理されるエンティティの種類を示します。ルール、既定値、一時テーブル、一時ストアド プロシージャ、またはシステム オブジェクトについては、依存関係情報は作成も管理もされません。

エンティティの種類

参照元エンティティ

参照先エンティティ

テーブル

可*

ビュー

フィルタ選択されたインデックス

可**

不可

フィルタ選択された統計情報

可**

不可

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 の依存関係について」を参照してください。

権限

データベースに対する VIEW DEFINITION 権限およびデータベースの sys.sql_expression_dependencies に対する SELECT 権限が必要です。既定では、SELECT 権限は db_owner 固定データベース ロールのメンバだけに与えられます。SELECT 権限と VIEW DEFINITION 権限が別のユーザーに与えられている場合、権限が許可されているユーザーはデータベース内のすべての依存関係を表示できます。

A. 別のエンティティによって参照されるエンティティを取得する

次の例では、ビュー Production.vProductAndDescription 内で参照されているテーブルおよび列を取得します。ビューは、referenced_entity_name 列および referenced_column_name 列に返されるエンティティ (テーブルおよび列) に依存します。

USE AdventureWorks;
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. 別のエンティティを参照するエンティティを取得する

次の例では、テーブル Production.Product を参照するエンティティを取得します。referencing_entity_name 列に返されるエンティティは、Product テーブルに依存します。

USE AdventureWorks;
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. データベース間の依存関係を取得する

次の例では、データベース間の依存関係をすべて取得します。この例ではまず、データベース db1 を作成し、データベース db2 と db3 のテーブルを参照する 2 つのストアド プロシージャを作成します。次に、sys.sql_expression_dependencies テーブルに対してクエリを実行して、プロシージャとテーブルの間のデータベース間依存関係をレポートします。参照先エンティティ t3 の referenced_schema_name 列に NULL が返されることに注意してください。これは、プロシージャの定義の中でそのエンティティにスキーマ名が指定されていないためです。

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

変更履歴

変更内容

「解説」にあった「CLR テーブル値関数については、列の依存関係は追跡されません」という記述を削除しました。