オブジェクトの依存関係を表示するカタログ ビュー/動的管理関数

SQL Server 2008 からは、オブジェクト(ビューやストアド プロシージャ、ユーザー定義関数など)の依存関係を表示するために、次の 3つのビュー/関数がサポートされました。

  • sql_expression_dependencies カタログ ビュー
  • dm_sql_referencing_entities 動的管理関数
  • dm_sql_referenced_entities 動的管理関数

これらのビュー/関数により、ストアド プロシージャが依存しているテーブルや、ユーザー定義関数を利用しているオブジェクトを容易に把握できるようになるので、大変便利です。
sql_expression_dependencies カタログ ビューは、次のように利用できます。

SELECT  OBJECT_NAME( referencing_id )
       ,referenced_entity_name AS 依存元, *
 FROM sys.sql_expression_dependencies

dm_sql_referenced_entities 動的管理関数は、次のように記述することで依存元の列名まで取得することができます。

SELECT  referenced_entity_name AS 依存元
       ,referenced_minor_name AS 依存元の列名, *
FROM
 sys.dm_sql_referenced_entities ('スキーマ名.オブジェクト名', 'OBJECT')


前述の sql_expression_dependencies カタログ ビューは、CTE(共通テーブル式)を利用して再帰クエリとして実行すれば、依存関係の階層を取得することができます。

DECLARE @referencing_entity AS sysname = N'オブジェクト名';

WITH ObjectDepends(entity_name, referenced_schema, referenced_entity,
                    referenced_id, level)
AS (
    SELECT entity_name = OBJECT_NAME(referencing_id)
    ,referenced_schema_name
    ,referenced_entity_name
    ,referenced_id
    ,0 AS level 
    FROM sys.sql_expression_dependencies AS sed 
    WHERE OBJECT_NAME(referencing_id) = @referencing_entity 
UNION ALL
    SELECT entity_name = OBJECT_NAME(sed.referencing_id)
    ,sed.referenced_schema_name
    ,sed.referenced_entity_name
    ,sed.referenced_id
    ,level + 1   
    FROM ObjectDepends AS o
		INNER JOIN sys.sql_expression_dependencies AS sed
		 ON sed.referencing_id = o.referenced_id
    )
SELECT entity_name,referenced_schema, referenced_entity, level
FROM ObjectDepends
ORDER BY level;


なお、そのほかの SQL Server 2008 の新機能の具体的な利用方法については、弊社執筆の SQL Server 2008 自習書シリーズ(下記 URL)の「SQL Server 2008 の注目の新機能をイチ早く試してみよう! 」編を参考にしてみてください。
http://www.microsoft.com/japan/sqlserver/2008/self-learning/default.mspx