sys.sql_expression_dependencies (Transact-SQL)

適用対象:yesSQL Server (サポートされているすべてのバージョン) YesAzure SQL Managed Instance yesAzure Synapse Analytics yesAnalytics Platform System (PDW)

現在のデータベース内のユーザー定義エンティティに対する名前による依存関係ごとに 1 行が含まれます。 これには、ネイティブ コンパイルのスカラー ユーザー定義関数とその他のSQL Server モジュール間の依存関係が含まれます。 2 つのエンティティ間の依存関係は、参照先エンティティと呼ばれる 1 つのエンティティが、参照元エンティティと呼ばれる別のエンティティの永続化されたSQL式に名前で表示されるときに作成されます。 たとえば、ビューの定義でテーブルが参照されている場合、参照元エンティティとしてのビューは、参照先エンティティであるテーブルに依存します。 テーブルが削除された場合、ビューは使用できません。

詳しくは、「インメモリ OLTP でのユーザー定義のスカラー関数」をご覧ください。

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

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

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

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

  • スキーマ バインド エンティティに対する列レベルの依存関係。 スキーマバインドされていないオブジェクトの列レベルの依存関係は、 sys.dm_sql_referenced_entitiesを使用して返すことができます。

  • サーバー レベルの DDL は、マスター データベースのコンテキストでトリガーされます。

列名 データ型 説明
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 になることはありません。 この列の値は、サーバー間参照とデータベース間参照の場合は常に NULL です。

ID を特定できない場合は、データベース内の参照に対して NULL。 スキーマ バインドされていない参照の場合、次の場合は ID を解決できません。

参照先エンティティがデータベースに存在しません。

参照先エンティティのスキーマが呼び出し元に依存し、実行時に解決される。 この場合、is_caller_dependent は 1 に設定されます。
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 スキーマ内のユーザー定義関数なのか、Sales という名前のメソッドを持つ UDT 型の GetOrder() という名前の列なのかは、ストアド プロシージャが実行されるまで不明です。

1 = 参照があいまいです。

0 = 参照が明確であるか、ビューが呼び出されたときにエンティティを正常にバインドできます。

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

解説

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

Note

Azure Synapse Analytics と Parallel Data Warehouseでは、テーブル、ビュー、フィルター処理された統計、および Transact-SQL ストアド プロシージャのエンティティ型がこの一覧からサポートされます。 依存関係情報は、テーブル、ビュー、およびフィルター処理された統計に対してのみ作成および管理されます。

エンティティ型 参照元エンティティ 参照先エンティティ
テーブル はい* はい
表示 はい はい
フィルター選択されたインデックス はい** いいえ
フィルター選択された統計情報 はい** いいえ
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 より大きい番号付きストアド プロシージャは、参照エンティティまたは参照先エンティティとして追跡されません。

アクセス許可

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

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

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

USE AdventureWorks2012;  
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_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 AdventureWorks2012;  
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 内のテーブルを参照する 2 つのストアド プロシージャを db2 作成します db3。 次に、sys.sql_expression_dependencies テーブルに対してクエリを実行して、プロシージャとテーブルの間のデータベース間依存関係をレポートします。 参照先エンティティ referenced_schema_namet3 列に 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  
  

参照

sys.dm_sql_referenced_entities (Transact-SQL)
sys.dm_sql_referencing_entities (Transact-SQL)