次の方法で共有


sys.sql_expression_dependencies (Transact-SQL)

適用対象:SQL ServerAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW) Microsoft Fabric のSQL 分析エンドポイント Microsoft Fabric のウェアハウス

現在のデータベースのユーザー定義エンティティに対する名前による依存関係ごとに 1 行を含みます。 これには、ネイティブ コンパイルのスカラー ユーザー定義関数とその他の SQL Server モジュール間の依存関係が含まれます。 2 つのエンティティ間の依存関係は、一方のエンティティ (参照先エンティティ) の名前が、もう一方のエンティティ (参照元エンティティ) の保存されている 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 構文表記規則」を参照してください。

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

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

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

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

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

スキーマ名を指定せずにエンティティが参照される非スキーマ バインド参照の場合は NULL。

スキーマ バインド エンティティは 2 つの部分で構成される名前を使用して定義および参照する必要があるので、スキーマ バインド参照の場合、NULL にすることはできません。
referenced_entity_name sysname 参照先エンティティの名前。 NULL 値は許可されません。
referenced_id int 参照先エンティティの ID。 スキーマ バインド参照の場合、この列の値は NULL になりません。 この列の値は、サーバー間参照とデータベース間参照では常に NULL です。

データベース内の参照の場合は NULL (ID が判別できない場合)。 非スキーマ バインド参照は、次の場合には 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。

解説

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

注意

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_name 列と referenced_column_name 列に返されるエンティティ (テーブルと列) に依存します。

USE AdventureWorks2022;  
GO  
SELECT OBJECT_NAME(referencing_id) AS referencing_entity_name,   
    o.type_desc AS referencing_description,   
    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 AdventureWorks2022;  
GO  
SELECT OBJECT_SCHEMA_NAME ( referencing_id ) AS referencing_schema_name,  
    OBJECT_NAME(referencing_id) AS referencing_entity_name,   
    o.type_desc AS referencing_description,   
    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 を作成し、データベース db2db3 のテーブルを参照する 2 つのストアド プロシージャを作成します。 次に、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)