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 を解決できません。
スキーマ バインド参照の場合、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 テーブル値関数については、列の依存関係は追跡されません」という記述を削除しました。 |