このトピックでは、アセンブリを設計するときに考慮する必要がある次の要素について説明します。
アセンブリのパッケージ化
アセンブリのセキュリティの管理
アセンブリに関する制限事項
アセンブリのパッケージ化
アセンブリには、複数の SQL Server ルーチンまたはそのクラスとメソッドの型の機能を含めることができます。 ほとんどの場合、関連する機能を実行するルーチンの機能を 1 つのアセンブリ内にパッケージ化することが適切です。これは特に、このようなルーチンで、メソッドが相互に呼び出しを行うクラスが共有される場合に当てはまります。 たとえば、CLR (共通言語ランタイム) トリガーと CLR ストアド プロシージャのデータ エントリ管理タスクを実行するクラスを 1 つのアセンブリにパッケージ化することがあります。 これは、これらのクラスのメソッドは、関連の少ないタスクのメソッドよりも相互に呼び出す可能性が高いためです。
コードをアセンブリにパッケージ化する場合は、次の点を考慮する必要があります。
CLR ユーザー定義関数に依存する CLR ユーザー定義型とインデックスにより、アセンブリに依存する持続データがデータベースに格納される可能性があります。 データベース内のアセンブリに依存する永続化されたデータがある場合、アセンブリのコードの変更は、多くの場合、より複雑になります。 そのため、一般に、永続化されたデータ依存関係が依存するコード (ユーザー定義関数を使用したユーザー定義型やインデックスなど) を、そのような永続化されたデータ依存関係を持たないコードから分離することをお勧めします。 詳細については、「 アセンブリ と ALTER ASSEMBLY の実装 (Transact-SQL)」を参照してください。
マネージド コードの一部で高いアクセス許可が必要な場合は、そのコードを、より高いアクセス許可を必要としないコードとは別のアセンブリに分離することをお勧めします。
アセンブリのセキュリティの管理
アセンブリでマネージド コードが実行されるときに、.NET コード アクセス セキュリティによって保護されているリソースにアセンブリがアクセスできる程度を制御できます。 これを行うには、アセンブリを作成または変更するときに、SAFE、EXTERNAL_ACCESS、UNSAFE の 3 つのアクセス許可セットのいずれかを指定します。
金庫
SAFE は既定のアクセス許可セットであり、最も制限が厳しいアクセス許可セットです。 SAFE アクセス許可を持つアセンブリによって実行されるコードは、ファイル、ネットワーク、環境変数、レジストリなどの外部システム リソースにアクセスできません。 SAFE コードは、ローカル SQL Server データベースのデータにアクセスしたり、ローカル データベースの外部のリソースにアクセスする必要のない計算やビジネス ロジックを実行したりできます。
ほとんどのアセンブリは、SQL Server の外部のリソースにアクセスすることなく、計算タスクとデータ管理タスクを実行します。 そのため、アセンブリのアクセス許可セットとして SAFE をお勧めします。
EXTERNAL_ACCESS
EXTERNAL_ACCESSを使用すると、アセンブリは、ファイル、ネットワーク、Web サービス、環境変数、レジストリなどの特定の外部システム リソースにアクセスできます。 EXTERNAL_ACCESS アセンブリを作成できるのは、EXTERNAL ACCESS アクセス許可を持つ SQL Server ログインだけです。
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