CLR 統合プログラミング モデルの制限事項
マネージド ストアド プロシージャまたはその他のマネージド データベース オブジェクトをビルドする場合、SQL Serverによって実行される特定のコード チェックは、データベースに初めて登録されたときに、ステートメントを使用して、実行時にもマネージド コード アセンブリに対してCREATE ASSEMBLY
チェックを実行します。 マネージド コードが実行時にもチェックされるのは、実行時に決して到達しないコード パスがアセンブリに含まれる場合があるためです。 このチェックにより、サード パーティ アセンブリを柔軟に登録できます。特に、クライアント環境での実行を目的に作成され、ホストされた CLR では実行されない "安全でない" コードを含むアセンブリをブロックしないようにすることができるため、サード パーティ アセンブリに柔軟に対応できます。 マネージド コードが満たす必要がある要件は、アセンブリが 、、または UNSAFE
SAFE
としてSAFE
EXTERNAL_ACCESS
最も厳密に登録されているかどうかによって異なります。以下に示します。
マネージド コード アセンブリには、制限事項に加えてコード セキュリティ権限も付与されます。 共通言語ランタイム (CLR) では、マネージド コードに対してコード アクセス セキュリティ (CAS) というセキュリティ モデルがサポートされます。 このモデルでは、コードの ID に基づいてアセンブリに権限が許可されます。 SAFE
、EXTERNAL_ACCESS
、および UNSAFE
の各アセンブリには、それぞれ異なる CAS 権限が付与されます。 詳細については、「 CLR 統合コード アクセス セキュリティ」を参照してください。
CREATE ASSEMBLY チェック
CREATE ASSEMBLY
ステートメントを実行する際には、セキュリティ レベルごとに次のチェックが実行されます。 いずれかのチェックが失敗した場合、CREATE ASSEMBLY
が失敗し、エラー メッセージが表示されます。
グローバル (すべてのセキュリティ レベル)
参照されるすべてのアセンブリは、次の条件のうち 1 つ以上を満たす必要があります。
既にデータベースに登録されていること。
サポートされているアセンブリの 1 つであること。 詳細については、「サポートされている.NET Framework ライブラリ」を参照してください。
場所を使用
CREATE ASSEMBLY FROM
しており、参照されているすべてのアセンブリとその依存関係を場所>で<使用できます。<>バイト ...>を使用<
CREATE ASSEMBLY FROM
しており、すべての参照はスペースで区切られたバイトで指定されます。
EXTERNAL_ACCESS
すべての EXTERNAL_ACCESS
アセンブリは、次の条件を満たす必要があります。
静的フィールドが情報の格納に使用されていないこと。 読み取り専用の静的フィールドは許可されます。
PEVerify テストにパスしていること。 .NET Framework SDK には、MSIL コードと関連メタデータがタイプ セーフの要件を満たしていることをチェックするための PEVerify ツール (peverify.exe) が付属しています。
SynchronizationAttribute
クラスなどによる同期が使用されていないこと。ファイナライザー メソッドが使用されていないこと。
EXTERNAL_ACCESS
アセンブリでは、次のカスタム属性が許可されません。
System.ContextStaticAttribute
System.MTAThreadAttribute
System.Runtime.CompilerServices.MethodImplAttribute
System.Runtime.CompilerServices.CompilationRelaxationsAttribute
System.Runtime.Remoting.Contexts.ContextAttribute
System.Runtime.Remoting.Contexts.SynchronizationAttribute
System.Runtime.InteropServices.DllImportAttribute
System.Security.Permissions.CodeAccessSecurityAttribute
System.Security.SuppressUnmanagedCodeSecurityAttribute
System.Security.UnverifiableCodeAttribute
System.STAThreadAttribute
System.ThreadStaticAttribute
SAFE
EXTERNAL_ACCESS
アセンブリの条件がすべてチェックされていること。
ランタイム チェック
コード アセンブリは、実行時に次の条件をチェックされます。 これらの条件のいずれかが見つからなかった場合、マネージド コードの実行が失敗し、例外がスローされます。
UNSAFE
バイト配列から メソッドを呼び出すことによって明示的にアセンブリを System.Reflection.Assembly.Load()
読み込むか、名前空間を使用 Reflection.Emit
して暗黙的に読み込むのは許可されません。
EXTERNAL_ACCESS
UNSAFE
の条件がすべてチェックされていること。
サポートされているアセンブリの一覧の中で、次のホスト保護属性 (HPA) 値で注釈を付けられている型およびメンバーはすべて許可されません。
SelfAffectingProcessMgmt
SelfAffectingThreading
同期
SharedState
ExternalProcessMgmt
ExternalThreading
SecurityInfrastructure
MayLeakOnAbort
UI
サポートされているアセンブリの HPA と許可されていない型とメンバーの一覧の詳細については、「 ホスト保護属性と CLR 統合プログラミング」を参照してください。
SAFE
EXTERNAL_ACCESS
の条件がすべてチェックされていること。
参照
サポートされている .NET Framework ライブラリ
CLR 統合のコード アクセス セキュリティ
ホスト保護属性と CLR 統合プログラミング
アセンブリの作成