SQL の依存関係について

新規 : 2005 年 12 月 5 日

SQL の依存関係とは、SQL の式の中で使用される、名前による参照です。このような参照では、あるオブジェクトが別のオブジェクトに依存することになります。sys.sql_dependencies カタログ ビューに対してクエリを実行すれば、すべての名前による依存関係を検索することができます。sys.sql_dependencies の各行には、参照元オブジェクトの保存されている SQL 式の中で、名前により参照されているエンティティ (referenced_major_id) が格納されています。

次の図に SQL の依存関係の例を示します。

SQL の依存関係

この図では、プロシージャ X とプロシージャ Y の 2 つのオブジェクトがあります。プロシージャ X の SQL 式では、プロシージャ Y を名前で参照しています。プロシージャ X は参照元オブジェクトまたは依存オブジェクトと呼ばれ、プロシージャ Y は参照先オブジェクトまたは独立オブジェクトと呼ばれます。プロシージャ X はプロシージャ Y に依存しているため、プロシージャ Y が存在しないと、プロシージャ X はランタイム エラーで失敗します。しかし、プロシージャ Y はプロシージャ X が存在しなくても失敗しません。

次の例は、ストアド プロシージャ X がストアド プロシージャ Y に依存する様子を表示します。

USE tempdb
GO
CREATE PROCEDURE Y AS
SELECT * FROM sys.objects
GO
CREATE PROCEDURE X as
    EXEC Y
GO

Y に対する X の依存関係を表示するには、次のクエリを実行します。

SELECT * 
FROM  sys.sql_dependencies 
WHERE object_id = object_id('X')
   AND   referenced_major_id = object_id('Y')
   AND   referenced_minor_id = 0
   AND   class = 0;
GO

プロシージャ X を削除しても、プロシージャ Y を実行することが可能です。プロシージャ Y はプロシージャ X に依存していません。逆に、プロシージャ Y を削除してプロシージャ X を実行すると、SQL Server はランタイム エラーを返します。プロシージャ X はプロシージャ Y に依存しています。

プロシージャ Y を削除すると、sys.sql_dependencies カタログ ビュー内のプロシージャ X に対する行も削除されます。この動作を表示するには、次のコードを実行します。

USE tempdb;
GO
DROP PROCEDURE Y;
GO
SELECT * 
FROM  sys.sql_dependencies 
WHERE object_id = object_id('X')
   AND   referenced_major_id = object_id('Y')
   AND   referenced_minor_id = 0
   AND   class = 0;
GO

依存関係の維持を強制するには、WITH SCHEMABINDING 句を使用します。ビューをスキーマ バインドすると、参照先のテーブルや列に対して、依存関係が壊れるような変更や削除を行うことができなくなります。同様に、関数をスキーマ バインドすると、参照先のオブジェクトや列に対して、関数の依存関係が壊れるような変更や削除を行うことができなくなります。スキーマ バインドの詳細については、「ユーザー定義関数の作成 (データベース エンジン)」および「ビューの設計と実装」を参照してください。

ms345449.note(ja-jp,SQL.90).gifメモ :
SQL Server 2005 では、スキーマ連結ストアド プロシージャやトリガはサポートされていません。

SQL の依存関係の例

次の表に、参照元オブジェクトと参照先オブジェクトの間に存在する、SQL の依存関係の例を示します。

参照元オブジェクトの種類

カタログ ビュー定義列の SQL 式

参照先エンティティの例

プロシージャ、関数、ビュー、トリガ

sys.sql_modules

ms345449.note(ja-jp,SQL.90).gifメモ :

サーバー レベルのトリガについては、sys.server_sql_modules を参照してください。

テーブル、プロシージャ、型

計算列

sys.computed_columns

関数、型、別の列

DEFAULT 定義

sys.default_constraints

関数

CHECK 制約

sys.check_constraints

関数、パーティション関数

番号付きプロシージャ

sys.numbered_procedure

テーブル、プロシージャ、型

スキーマ連結関数

sys.sql_modules

XML スキーマ コレクション

SQL 以外の依存関係の例

オブジェクト間で存在する依存関係のすべてが SQL の依存関係というわけではありません。別のオブジェクトを名前で参照している SQL 式がない場合は、2 つのオブジェクト間で SQL の依存関係は存在しません。次の表に、SQL 以外の依存関係の例をいくつか示します。

参照元オブジェクトの種類 参照先 説明

テーブル

テーブルとその列の間の依存関係は暗黙的です。この関係は、システム カタログで外部キー sys.columns.object_id として表されます。

列の DEFAULT 定義。以下に例を示します。

CREATE TABLE myTable AS

(ColA int CONSTRAINT Const1 DEFAULT 1)

列。例では ColA

DEFAULT 定義と列の間には SQL の依存関係は存在しません。既定の Const1 は列 ColA を名前で参照していないためです。代わりに sys.columns.default_object_id から DEFAULT 定義オブジェクトへの外部キー参照があります。

参照

その他の技術情報

sys.sql_dependencies (Transact-SQL)
sys.sysdepends (Transact-SQL)
sp_depends (Transact-SQL)

ヘルプおよび情報

SQL Server 2005 の参考資料の入手