CLR 統合プログラミング モデルの制限事項
マネージ ストアド プロシージャなどのマネージ データベース オブジェクトを作成する際には、SQL Server によって実行される特定のコード チェックについて考慮する必要があります。SQL Server は、マネージ コード アセンブリのデータベースへの初回登録時および実行時に、CREATE ASSEMBLY ステートメントを使用して、そのマネージ コード アセンブリをチェックします。マネージ コードが実行時にもチェックされるのは、実行時に決して到達しないコード パスがアセンブリに含まれる場合があるためです。このチェックにより、サード パーティ アセンブリを柔軟に登録できます。特に、クライアント環境での実行を目的に作成され、ホストされた CLR では実行されない "安全でない" コードを含むアセンブリをブロックしないようにすることができるため、サード パーティ アセンブリに柔軟に対応できます。マネージ コードが満たさなければならない要件は、アセンブリが、SAFE、EXTERNAL_ACCESS、または UNSAFE のどのセキュリティ レベルで登録されたかによって異なります。以下で示すように、最も要件が厳しいのは SAFE アセンブリです。
マネージ コード アセンブリには、制限事項に加えてコード セキュリティ権限も付与されます。共通言語ランタイム (CLR) では、マネージ コードに対してコード アクセス セキュリティ (CAS) というセキュリティ モデルがサポートされます。このモデルでは、コードの ID に基づいてアセンブリに権限が許可されます。SAFE、EXTERNAL_ACCESS、および UNSAFE の各アセンブリには、それぞれ異なる CAS 権限が付与されます。詳細については、「CLR 統合のコード アクセス セキュリティ」を参照してください。
CREATE ASSEMBLY チェック
CREATE ASSEMBLY ステートメントを実行する際には、セキュリティ レベルごとに次のチェックが実行されます。いずれかのチェックが失敗した場合、CREATE ASSEMBLY が失敗し、エラー メッセージが表示されます。
グローバル (すべてのセキュリティ レベル)
参照されるすべてのアセンブリは、次の条件のうち 1 つ以上を満たす必要があります。
既にデータベースに登録されていること。
サポートされているアセンブリの 1 つであること。詳細については、「サポートされている .NET Framework ライブラリ」を参照してください。
CREATE ASSEMBLY FROM<location> を使用しており、参照されるすべてのアセンブリとその依存関係を <location> で使用できること。
CREATE ASSEMBLY FROM<bytes ...> を使用しており、参照されるすべてのアセンブリがスペース区切りのバイトで指定されていること。
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
Synchronization
SharedState
ExternalProcessMgmt
ExternalThreading
SecurityInfrastructure
MayLeakOnAbort
UI
HPA の詳細と、サポートされているアセンブリの許可されない型とメンバの一覧については、「ホスト保護属性と CLR 統合プログラミング」を参照してください。
SAFE
EXTERNAL_ACCESS の条件がすべてチェックされていること。