sys.sql_expression_dependencies (Transact-SQL)
適用対象:SQL Server (サポートされているすべてのバージョン)
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics 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_name
referenced_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_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)