アセンブリ - デザイン

適用対象:SQL Server

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

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

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

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

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

アセンブリには、複数の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 アセンブリを作成できるのは、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 を使用しなくてもカスタム アセンブリから参照できます。

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  

参照

アセンブリ (データベース エンジン)
CLR 統合のセキュリティ