SQL Serverでは、sys.sql_expression_dependencies
を使用できます。 現在のデータベース内のユーザー定義エンティティへのすべての依存関係を返すシステムカタログビュー。これには、ネイティブにコンパイルされたスカラーユーザー定義関数と他のSQLServerモジュール間の依存関係が含まれます。
このビューを使用して、次のことができます。
- 特定のエンティティに依存するエンティティを返す
- 特定のエンティティが依存するエンティティを返す
したがって、たとえば、これを使用して、特定のテーブルを参照するすべてのオブジェクトを返すことができます。また、これを使用して、特定のストアドプロシージャがコード内で参照するすべてのオブジェクトを返すこともできます。
具体的には、sys.sql_expression_dependencies
ビューは、次のエンティティの依存関係情報をレポートします:
- スキーマにバインドされたエンティティ。
- スキーマにバインドされていないエンティティ。
- クロスデータベースおよびクロスサーバーエンティティ。エンティティ名が報告されます。ただし、エンティティIDは解決されません。
- スキーマにバインドされたエンティティに対する列レベルの依存関係。スキーマにバインドされていないオブジェクトの列レベルの依存関係は、sys.dm_sql_referenced_entitiesを使用して返すことができます。
- サーバーレベルのDDLは、マスターデータベースのコンテキストでトリガーされます。
例1-返されたすべての列
sys.sql_expression_dependencies
からすべての列を選択する簡単な例を次に示します。 。これにより、ビューで実際に返されるデータがわかります。これらの列のいずれかをクエリで使用して、関心のあるデータのみを返すことができます。
SELECT TOP(1) * FROM sys.sql_expression_dependencies;
結果(垂直出力を使用):
referencing_id | 114099447 referencing_minor_id | 0 referencing_class | 1 referencing_class_desc | OBJECT_OR_COLUMN is_schema_bound_reference | 0 referenced_class | 1 referenced_class_desc | OBJECT_OR_COLUMN referenced_server_name | NULL referenced_database_name | NULL referenced_schema_name | dbo referenced_entity_name | Client referenced_id | 434100587 referenced_minor_id | 0 is_caller_dependent | 0 is_ambiguous | 0
この例では、垂直方向の出力を使用して、水平方向にスクロールしなくても列名を確認しやすくしています。したがって、列名は左側に表示され、それぞれの値は右側に表示されます。
また、簡潔にするために、TOP(1)
を使用しました 結果を最初の行だけに制限します。
例2–エンティティに依存するエンティティを検索する
特定のエンティティに依存するオブジェクトを見つけるには、そのエンティティのreferencing_id
を使用します ビューから選択する場合。
例:
SELECT referenced_server_name AS [Referenced Server], referenced_database_name AS [Referenced DB], referenced_schema_name AS [Referenced Schema], referenced_entity_name AS [Referenced Entity], referenced_class_desc AS [Referenced Entity Class] FROM sys.sql_expression_dependencies WHERE referencing_id = OBJECT_ID('uspGetClient');
結果:
+---------------------+-----------------+---------------------+---------------------+---------------------------+ | Referenced Server | Referenced DB | Referenced Schema | Referenced Entity | Referenced Entity Class | |---------------------+-----------------+---------------------+---------------------+---------------------------| | NULL | NULL | dbo | Client | OBJECT_OR_COLUMN | | NULL | NULL | NULL | clientcode | TYPE | +---------------------+-----------------+---------------------+---------------------+---------------------------+
ここでは、uspGetClient
で参照されているすべてのエンティティを取得します ストアドプロシージャ。
uspGetClient
の実際の定義は次のとおりです :
CREATE PROCEDURE [dbo].[uspGetClient] @ClientCode clientcode AS SELECT FirstName, LastName FROM [dbo].[Client] WHERE ClientCode = @ClientCode;
したがって、Client
というテーブルからデータを選択していることがわかります。 、および@ClientCode
という引数を受け入れます (ユーザー定義のエイリアス)データ型がclientcode
。
例3–エンティティが依存するエンティティを検索する
また、切り替えて、特定のエンティティが依存するオブジェクトを取得することもできます。これを行うには、referenced_id
を使用します (referenced_id
の代わりに )ビューから選択する場合。
例:
SELECT OBJECT_NAME(referencing_id) AS [Referencing Entity], OBJECT_NAME(referencing_minor_id) AS [Referencing Minor Entity], referencing_class_desc AS [Class], COL_NAME(referenced_id, referenced_minor_id) AS [Column] FROM sys.sql_expression_dependencies WHERE referenced_id = OBJECT_ID('Client');
結果:
+----------------------+----------------------------+------------------+------------+ | Referencing Entity | Referencing Minor Entity | Class | Column | |----------------------+----------------------------+------------------+------------| | uspGetClient | NULL | OBJECT_OR_COLUMN | NULL | | uspGetOrdersByClient | NULL | OBJECT_OR_COLUMN | NULL | | chkClientCode | NULL | OBJECT_OR_COLUMN | ClientCode | +----------------------+----------------------------+------------------+------------+
この例では、どのエンティティがClient
に依存しているかを確認したいと思いました。 テーブル(つまり、SQLコードでそのテーブルを参照するエンティティ)
別の列も選択したことに気付くでしょう。これは、参照に関する情報を探しているためです。 参照ではなくエンティティ 前の例のようなエンティティ。
例4–詳細情報を取得する
このビューを他のビューやテーブルと結合して、より多くの情報を返すことができます。
たとえば、sys.objects
と結合できます 参照オブジェクトのタイプを取得するには:
SELECT OBJECT_NAME(referencing_id) AS [Referencing Entity], o.type_desc AS [Type], COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS [Column], referenced_entity_name AS [Referenced Entity], COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS [Column] 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'Client');
結果:
+----------------------+----------------------+----------+---------------------+------------+ | Referencing Entity | Type | Column | Referenced Entity | Column | |----------------------+----------------------+----------+---------------------+------------| | uspGetClient | SQL_STORED_PROCEDURE | (n/a) | Client | (n/a) | | uspGetOrdersByClient | SQL_STORED_PROCEDURE | (n/a) | Client | (n/a) | | chkClientCode | CHECK_CONSTRAINT | (n/a) | Client | ClientCode | +----------------------+----------------------+----------+---------------------+------------+
この例では、COALESCE()
も追加しました (n/a)
を返す関数 referencing_minor_id
のときはいつでも NULL
です 。この関数は、SQLServerでNULL値を文字列に置き換えることができるいくつかの方法の1つです。
例5–データベース間およびサーバー間エンティティ
前述のように、sql_expression_dependencies
クロスデータベースおよびクロスサーバーエンティティでも機能します。ただし、この場合、エンティティ名は報告されますが、エンティティIDは解決されません。
この例では、例2とまったく同じコードを使用していますが、今回は別のエンティティ用です。今回は、uspGetAlbumsByArtist
に依存するエンティティを見つけたいと思います。 :
SELECT referenced_server_name AS [Referenced Server], referenced_database_name AS [Referenced DB], referenced_schema_name AS [Referenced Schema], referenced_entity_name AS [Referenced Entity], referenced_class_desc AS [Referenced Entity Class] FROM sys.sql_expression_dependencies WHERE referencing_id = OBJECT_ID('uspGetClient');
結果:
+---------------------+-----------------+---------------------+---------------------+---------------------------+ | Referenced Server | Referenced DB | Referenced Schema | Referenced Entity | Referenced Entity Class | |---------------------+-----------------+---------------------+---------------------+---------------------------| | Homer | Music | dbo | Albums | OBJECT_OR_COLUMN | +---------------------+-----------------+---------------------+---------------------+---------------------------+
この例では、参照されるサーバーと参照されるデータベースに値があります(前の例のようにNULLではありません)。これは、uspGetAlbumsByArtist
ストアドプロシージャは、4つの部分からなる名前を使用して、リンクサーバー上のエンティティを参照します(前の例のストアドプロシージャは、4つの部分からなる名前を使用せず、3つの部分からなる名前を使用してDBを指定しませんでした) 。
この例では、Homer
リンクサーバーの名前であり、Music
ストアドプロシージャがクエリを実行するデータベースです。
これはuspGetAlbumsByArtist
で確認できます。 の定義:
CREATE PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int AS SELECT AlbumName FROM [Homer].[Music].[dbo].[Albums] WHERE ArtistId = @ArtistId;
公式ドキュメント
詳細と例については、sys.sql_expression_dependencies
を参照してください。 MicrosoftのWebサイトで。
これは、SSMSを介して依存関係を取得するための手順を含む別のMicrosoftの記事です。