アセンブリの設計

適用対象: SQL Server

この記事では、アセンブリを設計するときに考慮する必要がある次の要素について説明します。

  • アセンブリのパッケージ化
  • アセンブリのセキュリティの管理
  • アセンブリに関する制限事項

パッケージ アセンブリ

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

コードをアセンブリにパッケージ化する場合は、次の点を考慮してください。

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

  • マネージド コードの一部に高いアクセス許可が必要な場合は、そのコードを、より高いアクセス許可を必要としないコードとは別のアセンブリに分離することをお勧めします。

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

アセンブリでマネージド コードが実行されるときに、.NET コード アクセス セキュリティによって保護されているリソースにアセンブリがアクセスできる程度を制御できます。 これを行うには、アセンブリを作成または変更するときに、 SAFEEXTERNAL_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を使用しなくてもカスタム アセンブリから参照できます。

  • CustomMarshalers.dll
  • Microsoft.VisualBasic.dll
  • Microsoft.VisualC.dll
  • mscorlib.dll
  • System.dll
  • System.Configuration.dll
  • System.Core.dll
  • System.Data.dll
  • System.Data.OracleClient.dll
  • System.Data.SqlXml.dll
  • System.Deployment.dll
  • System.Security.dll
  • System.Transactions.dll
  • System.Web.Services.dll
  • system.Xml.dll
  • System.Xml.Linq.dll