sys.sql_expression_dependencies (Transact-SQL)
適用対象: SQL Server Azure SQL Managed Instance Azure Synapse Analytics Analytics 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
を作成し、データベース db2
と db3
のテーブルを参照する 2 つのストアド プロシージャを作成します。 次に、sys.sql_expression_dependencies
テーブルに対してクエリを実行して、プロシージャとテーブルの間のデータベース間依存関係をレポートします。 参照先エンティティ referenced_schema_name
の t3
列に 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)