アセンブリのデザイン

このトピックでは、アセンブリをデザインするときに考慮する必要がある次の項目について説明します。

  • アセンブリのパッケージ化

  • アセンブリのセキュリティ管理

  • アセンブリに関する制限事項

アセンブリのパッケージ化

アセンブリのクラスやメソッドには、複数の SQL Server ルーチンまたは型の機能を含めることができます。ほとんどの場合、関連する機能を実行するルーチンの機能を 1 つのアセンブリ内にパッケージ化することが適切です。これは特に、このようなルーチンで、メソッドが相互に呼び出しを行うクラスが共有される場合に当てはまります。たとえば、CLR (共通言語ランタイム) トリガと CLR ストアド プロシージャのデータ エントリ管理タスクを実行するクラスを 1 つのアセンブリにパッケージ化することがあります。これは、これらのクラスのメソッドは、関連性の低いタスクを実行するクラスのメソッドよりも相互に呼び出しを行う可能性が高いためです。

コードをアセンブリにパッケージ化しているときは、次のことを考慮する必要があります。

  • CLR ユーザー定義関数に依存する CLR ユーザー定義型とインデックスにより、アセンブリに依存する持続データがデータベースに格納される可能性があります。多くの場合、アセンブリに依存する持続データがデータベースに存在すると、アセンブリのコードを変更することが複雑になることがあります。そのため、一般に、持続データの依存関係があるコード (ユーザー定義関数を使用するユーザー定義型やインデックスなど) とそのような持続データの依存関係がないコードは切り離した方が適切です。詳細については、「アセンブリの実装」および「ALTER ASSEMBLY (Transact-SQL)」を参照してください。

  • マネージ コードの一部分で上位の権限が必要な場合、そのコードは、上位の権限を必要としないコードとは別のアセンブリにパッケージ化することをお勧めします。

アセンブリのセキュリティ管理

アセンブリでマネージ コードが実行されるときに、.NET コード アクセス セキュリティによって保護されているリソースにアセンブリがアクセスできる程度を制御できます。この制御は、アセンブリを作成または変更するときに、SAFE、EXTERNAL_ACCESS、または UNSAFE の 3 つの中のいずれかの権限セットを指定して行います。

SAFE

SAFE は既定の権限セットであり、最も強い制限です。SAFE 権限を指定したアセンブリによって実行されるコードでは、ファイル、ネットワーク、環境変数、またはレジストリなどの外部システム リソースにアクセスできません。SAFE コードでは、ローカルの SQL Server データベースのデータにアクセスしたり、ローカル データベースの外部にあるリソースへのアクセスを必要としない計算やビジネス ロジックを実行したりすることができます。

ほとんどのアセンブリでは、SQL Server の外部にあるリソースにアクセスしなくても計算やデータ管理タスクを実行できます。そのため、アセンブリの権限セットとして SAFE を使用することをお勧めします。

EXTERNAL_ACCESS

EXTERNAL_ACCESS を使用すると、アセンブリでファイル、ネットワーク、Web サービス、環境変数、およびレジストリなどの特定の外部システム リソースにアクセスできます。EXTERNAL ACCESS 権限を持つ SQL Server ログインだけが EXTERNAL_ACCESS アセンブリを作成できます。

SAFE アセンブリおよび EXTERNAL_ACCESS アセンブリには検証可能なタイプ セーフのコードしか格納できません。つまり、これらのアセンブリでクラスにアクセスするには、型定義で有効な整形式のエントリ ポイントを使用する必要があります。そのため、これらのアセンブリでは、コードによって所有されていないメモリ バッファに自由にアクセスすることはできません。また、SQL Server プロセスの堅牢性に悪影響を与える可能性がある操作を実行することもできません。

UNSAFE

UNSAFE を使用すると、アセンブリでは SQL Server の内外を問わずどちらのリソースにも無制限にアクセスできます。UNSAFE アセンブリの内部で実行されているコードで、アンマネージ コードを呼び出すことができます。

また、UNSAFE を指定すると、CLR 検証機能によってタイプ セーフではないと見なされる操作をアセンブリのコードで実行できます。これらの操作により、SQL Server プロセス空間のメモリ バッファに制御なしにアクセスされる可能性があります。また、UNSAFE アセンブリにより、SQL Server または共通言語ランタイムのいずれかのセキュリティ システムが機能しなくなる可能性もあります。UNSAFE 権限は、経験豊かな開発者や管理者によって信頼性の高いアセンブリにのみ与えるようにする必要があります。sysadmin 固定サーバー ロールのメンバだけが、UNSAFE アセンブリを作成できます。

アセンブリに関する制限事項

SQL Server では、アセンブリのマネージ コードに特定の制限を設けて、これらのコードを信頼性および拡張性の高い方法で実行できるようにしています。つまり、SAFE アセンブリと 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.STAThreadAttribute
System.ThreadStaticAttribute

また、SAFE アセンブリと EXTERNAL_ACCESS アセンブリには、次のカスタム属性で注釈を付けることができません。

System.Security.SuppressUnmanagedCodeSecurityAttribute
System.Security.UnverifiableCodeAttribute

禁止されている .NET Framework API

禁止されているいずれかの HostProtectionAttributes で注釈が付けられているすべての Microsoft.NET Framework API は、SAFE アセンブリおよび EXTERNAL_ACCESS アセンブリから呼び出すことができません。

eSelfAffectingProcessMgmt
eSelfAffectingThreading
eSynchronization
eSharedState 
eExternalProcessMgmt
eExternalThreading
eSecurityInfrastructure
eMayLeakOnAbort
eUI

サポートされている .NET Framework アセンブリ

カスタム アセンブリで参照されているアセンブリは、CREATE ASSEMBLY を使用して SQL Server に読み込む必要があります。次の .NET Framework アセンブリは既に SQL Server に読み込まれているため、CREATE ASSEMBLY を使用しなくてもカスタム アセンブリで参照できます。

custommarshallers.dll
Microsoft.visualbasic.dll
Microsoft.visualc.dll
mscorlib.dll
system.data.dll
System.Data.SqlXml.dll
system.dll
system.security.dll
system.web.services.dll
system.xml.dll
System.Transactions
System.Data.OracleClient
System.Configuration