SQL の依存関係について
新規 : 2005 年 12 月 5 日
SQL の依存関係とは、SQL の式の中で使用される、名前による参照です。このような参照では、あるオブジェクトが別のオブジェクトに依存することになります。sys.sql_dependencies カタログ ビューに対してクエリを実行すれば、すべての名前による依存関係を検索することができます。sys.sql_dependencies の各行には、参照元オブジェクトの保存されている SQL 式の中で、名前により参照されているエンティティ (referenced_major_id) が格納されています。
次の図に 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 句を使用します。ビューをスキーマ バインドすると、参照先のテーブルや列に対して、依存関係が壊れるような変更や削除を行うことができなくなります。同様に、関数をスキーマ バインドすると、参照先のオブジェクトや列に対して、関数の依存関係が壊れるような変更や削除を行うことができなくなります。スキーマ バインドの詳細については、「ユーザー定義関数の作成 (データベース エンジン)」および「ビューの設計と実装」を参照してください。
メモ : |
---|
SQL Server 2005 では、スキーマ連結ストアド プロシージャやトリガはサポートされていません。 |
SQL の依存関係の例
次の表に、参照元オブジェクトと参照先オブジェクトの間に存在する、SQL の依存関係の例を示します。
参照元オブジェクトの種類
カタログ ビュー定義列の SQL 式
参照先エンティティの例
プロシージャ、関数、ビュー、トリガ
sys.sql_modules
メモ :
サーバー レベルのトリガについては、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 定義。以下に例を示します。
|
列。例では |
DEFAULT 定義と列の間には SQL の依存関係は存在しません。既定の |
参照
その他の技術情報
sys.sql_dependencies (Transact-SQL)
sys.sysdepends (Transact-SQL)
sp_depends (Transact-SQL)