CLR 統合のセキュリティのリンク

ここでは、Transact-SQL またはいずれかのマネージ言語で、SQL Server 内のユーザー コードが相互に呼び出すしくみを説明します。このようなオブジェクト間のリレーションシップをリンクと呼びます。

呼び出しリンク

呼び出しリンクは、オブジェクトを呼び出すユーザーからのコード呼び出し (ストアド プロシージャを呼び出す Transact-SQL バッチなど)、または共通言語ランタイム (CLR) ストアド プロシージャや関数からのコード呼び出しのいずれかに対応しています。呼び出しリンクにより、呼び出し先の EXECUTE 権限がチェックされます。

テーブル アクセス リンク

テーブル アクセス リンクは、テーブル、ビュー、またはテーブル値関数の値の取得や変更に対応します。テーブル アクセス リンクは、SELECT 権限、INSERT 権限、UPDATE 権限、および DELETE 権限に関してアクセス制御の粒度が細かいという点を除いて、呼び出しリンクと同じです。

ゲート リンク

ゲート リンクは、一度確立されると、実行されている間、オブジェクトのリレーションシップ間で権限がチェックされることはありません。2 つのオブジェクト (たとえば、オブジェクト x とオブジェクト y) の間にゲート リンクがある場合、オブジェクト y の権限とオブジェクト y からアクセスされる他のオブジェクトの権限は、オブジェクト x の作成時にのみチェックされます。オブジェクト x の作成時、y の REFERENCE 権限が x の所有者に対してチェックされます。実行時 (たとえば、他のユーザーがオブジェクト x を呼び出したとき) には、y または y からの静的な参照先である他のオブジェクトに対する権限チェックは行われません。実行時には、オブジェクト x 自体に対して、適切な権限がチェックされます。

ゲート リンクは、2 つのオブジェクト間のメタデータの依存関係と常に組み合わせて使用されます。このメタデータの依存関係とは、SQL Server カタログで確立されるリレーションシップです。このリレーションシップにより、別のオブジェクトが依存しているオブジェクトの削除が回避されます。

ゲート リンクは、多くの依存オブジェクトに権限を許可することが不適切または管理不可能である場合に役立ちます。SQL Server 2000 では、計算列やフルテキスト インデックスが作成された列に対してゲート リンクを使用します。SQL Server 2005 以降では、CLR アセンブリ (CLR プロシージャ、トリガ、関数、型、集計など) への Transact-SQL エントリ ポイントを定義するオブジェクトと、それらを定義する際のベースになるアセンブリとの間にゲート リンクが導入されています。このようなオブジェクトに対してゲート セキュリティを使用するということは、CLR アセンブリ内で定義された Transact-SQL エントリ ポイントを呼び出すために呼び出し元で必要になるのは、その Transact-SQL エントリ ポイントに対する適切な権限のみであることを意味します。呼び出し元には、そのアセンブリまたはそのアセンブリが静的に参照するその他のアセンブリに対する権限は不要です。アセンブリに対する権限は、Transact-SQL エントリ ポイントの作成時にチェックされます。

SQL Server 承認ベースのセキュリティ

CLR ベースのデータベース オブジェクトの呼び出しと、これらのオブジェクト間で実行される SQL Server セキュリティ チェックを支える基本的な規則を次に示します。最初の 3 つの規則では、どの権限がどのオブジェクトに対してチェックされるかを定義し、4 つ目の規則では、権限がチェックされる対象の実行コンテキストを定義します。

  1. 呼び出しが同じオブジェクト内で発生する場合を除いて、すべての呼び出しに EXECUTE 権限が必要になります。つまり、同じアセンブリ内での呼び出しには権限チェックは必要ありません。権限は実行時にチェックされます。

  2. ゲート リンクでは、呼び出し元オブジェクトの作成時に、呼び出し先に対する REFERENCE 権限が必要になります。呼び出し元オブジェクトの作成時に、そのオブジェクトの所有者の権限がチェックされます。

  3. テーブル アクセス リンクでは、アクセス先のテーブルまたはビューに対する SELECT 権限、INSERT 権限、UPDATE 権限、または DELETE 権限が必要になります。

  4. 現在の実行コンテキストに対して権限がチェックされます。呼び出し元とは異なる実行コンテキストでプロシージャや関数を作成できます。アセンブリは、常に、プロシージャ、関数、またはトリガに対して定義されている実行コンテキストで作成されます。

関連項目

概念