部分的に信頼される呼び出し元の許容
コード ライブラリの共有は、共通言語ランタイム (CLR) 統合に関する共通のシナリオです。この場合、ユーザー定義型、ストアド プロシージャ、ユーザー定義関数、ユーザー定義集計、トリガ、またはユーティリティ クラスを含んだアセンブリは、しばしば別のアセンブリまたはアプリケーションによってアクセスされます。複数のアプリケーションで共有されるコード ライブラリは、厳密な名前で署名する必要があります。
System.Security.AllowPartiallyTrustedCallers 属性で明示的にマークされていない共有マネージ コード アセンブリにアクセスできるのは、ランタイム コード アクセス セキュリティ システムによって完全に信頼されるアプリケーションだけです。部分的に信頼されるアセンブリ (SQL Server で SAFE または EXTERNAL_ACCESS 権限セットを使用して登録されているアセンブリ) が、この属性なしに、厳密な名前で署名されたアセンブリへのアクセスを試行すると、System.Security.SecurityException がスローされます。表示されるエラー メッセージは、たとえば次のようになります。
Msg 6522, Level 16, State 1, Procedure usp_RSTest, Line 0
A .NET Framework error occurred during execution of user defined
routine or aggregate 'usp_RSTest': System.Security.SecurityException: That assembly does not allow partially trusted callers.
System.Security.SecurityException: at
System.Security.CodeAccessSecurityEngine.ThrowSecurityException(
Assembly asm, PermissionSet granted,PermissionSet refused,
RuntimeMethodHandle rmh, SecurityAction action, Object demand,
IPermission permThatFailed) at
Microsoft.Samples.SqlServer.TestResultSet.Test()
グローバル アセンブリ キャッシュに追加されるアセンブリを除き、SQL Server に登録されるすべてのアセンブリは、AllowPartiallyTrustedCallers 属性でマークすることをお勧めします。それにより、SQL Server によって読み込まれるアセンブリが相互にアクセスできるようになります。グローバル アセンブリ キャッシュに追加されるアセンブリは、部分的に信頼される呼び出し元から予期しないコンテキストで使用できるようになるため、AllowPartiallyTrustedCallers 属性を追加する前に、安全性について十分に確認する必要があります。アセンブリは、完全に信頼されないようにする (SQL Server に UNSAFE 権限セットを使用して登録する) 必要があります。
詳細については、.NET Framework Software Development Kit の「部分信頼コードからのライブラリの使用」を参照してください。
例
多数のサーバー側 CLR 統合アプリケーションにとって役立つユーティリティ クラスがあるとします。たとえば、クエリを呼び出した結果を表すクラスです。このコンポーネントを共有できるようにするには、このユーティリティ クラスを別個のアセンブリに配置します。それにより、このアセンブリは、CLR 統合オブジェクトを含んだ他のさまざまなアセンブリから参照されます。このユーティリティ クラスは、さまざまなサーバー アプリケーションで使用されるため、十分に確認し、セキュリティ上のすべての問題を解決しておきます。次に、そのユーティリティ クラスを含んだアセンブリに、AllowPartiallyTrustedCallers 属性を適用します。それにより、SAFE または EXTERNAL_ACCESS 権限セットでマークされたアセンブリに含まれた CLR 統合オブジェクトは、別のアセンブリに配置されている場合でも、このユーティリティ クラスおよびメソッドを使用することができます。AllowPartiallyTrustedCallers 属性の使用方法の例については、「結果セット サンプル」を参照してください。