次の方法で共有


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

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

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

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

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

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

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

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

CLR ベースのデータベース オブジェクトの呼び出しと呼び出しのSQL Serverセキュリティ チェックの背後にある基本的な規則を次に示します。最初の 3 つの規則では、どのアクセス許可をチェックし、どのオブジェクトに対してどの実行コンテキストを確認するかを定義します。

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

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

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

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

参照

CLR 統合のセキュリティ