CLR 統合プログラミング モデルの制限事項

適用対象:SQL ServerAzure SQL Managed Instance

マネージド ストアド プロシージャまたはその他のマネージド データベース オブジェクトを構築する場合は、考慮する必要があるSQL Serverによって実行される特定のコード チェックがあります。 SQL Serverは、CREATE ASSEMBLY ステートメントを使用して、マネージド コード アセンブリが最初にデータベースに登録されるときに、実行時にもチェックを実行します。 マネージド コードが実行時にもチェックされるのは、実行時に決して到達しないコード パスがアセンブリに含まれる場合があるためです。 このチェックにより、サード パーティ アセンブリを柔軟に登録できます。特に、クライアント環境での実行を目的に作成され、ホストされた CLR では実行されない "安全でない" コードを含むアセンブリをブロックしないようにすることができるため、サード パーティ アセンブリに柔軟に対応できます。 マネージド コードが満たす必要がある要件は、アセンブリが SAFEEXTERNAL_ACCESS、または UNSAFE として登録されているかどうかによって異なります。 SAFE が最も厳密であり、以下に示します。

マネージド コード アセンブリには、制限事項に加えてコード セキュリティ権限も付与されます。 共通言語ランタイム (CLR) では、マネージド コードに対してコード アクセス セキュリティ (CAS) というセキュリティ モデルがサポートされます。 このモデルでは、コードの ID に基づいてアセンブリに権限が許可されます。 SAFEEXTERNAL_ACCESSUNSAFE アセンブリには、異なる 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

  • Synchronization

  • SharedState

  • ExternalProcessMgmt

  • ExternalThreading

  • SecurityInfrastructure

  • MayLeakOnAbort

  • UI

サポートされているアセンブリの HPA と許可されていない型とメンバーの一覧の詳細については、「 ホスト保護属性と CLR 統合プログラミング」を参照してください。

SAFE

すべての EXTERNAL_ACCESS 条件がチェックされます。

参照

サポートされている .NET Framework ライブラリ
CLR 統合のコード アクセス セキュリティ
ホスト保護属性と CLR 統合プログラミング
アセンブリの作成