SQL Server プログラミングとホスト保護属性

SQL Server ホストでマネージ コードを読み込んで実行するには、コード アクセス セキュリティとホスト リソース保護の両方に対するホストの要件を満たす必要があります。 コード アクセス セキュリティ要件は、SAFE、EXTERNAL-ACCESS、UNSAFE という 3 つの SQL Server アクセス許可セットのうちのいずれかによって指定されます。 SAFE アクセス許可セットまたは EXTERNAL-ACCESS アクセス許可セット内で実行するコードでは、HostProtectionAttribute 属性が適用されている特定の型またはメンバーの使用を避ける必要があります。 HostProtectionAttribute は、ホストによって許可されない可能性がある特定のコード コンストラクター (型またはメソッド) を識別するという点で、信頼性の保証に相当するほどのセキュリティ アクセス許可とは言えません。 HostProtectionAttribute を使用すると、ホストの安定性を保護するのに役立つプログラミング モデルが適用されます。

ホスト保護属性

ホスト保護属性は、ホスト プログラミング モデルに適合せず、次のような信頼性に対する脅威を表す型やメンバーを識別します。

  • ホスト プログラミング モデルに適合しないこと以外に問題がない。

  • サーバー管理ユーザー コードの不安定化につながる可能性がある。

  • サーバー プロセス自体の不安定化につながる可能性がある。

SQL Server は、SharedStateSynchronizationMayLeakOnAbort、または ExternalProcessMgmtHostProtectionResource 値を指定する HostProtectionAttribute を持つ型またはメンバーを許可しません。 これにより、共有状態を有効にしたり、同期を実行したり、終了時にリソース リークの原因になったり、SQL Server プロセスの整合性に影響したりするメンバーのアセンブリによる呼び出しが防止されます。

許可されない型およびメンバー

HostProtectionResource 値が SQL Server によって許可されない型とメンバーを次の表に示します。

名前空間

型またはメンバー

Microsoft.Win32

PowerModeChangedEventArgs クラス

PowerModeChangedEventHandler デリゲート

SessionEndedEventArgs クラス

SessionEndedEventHandler デリゲート

SessionEndingEventArgs クラス

SessionEndingEventHandler デリゲート

SessionSwitchEventArgs クラス

SessionSwitchEventHandler デリゲート

SystemEvents クラス

TimerElapsedEventArgs クラス

TimerElapsedEventHandler デリゲート

UserPreferenceChangedEventArgs クラス

UserPreferenceChangingEventArgs クラス

System.Collections

ArrayList.Synchronized メソッド

Hashtable.Synchronized メソッド

Queue.Synchronized メソッド

SortedList.Synchronized メソッド

Stack.Synchronized メソッド

System.ComponentModel

AddingNewEventArgs クラス

AddingNewEventHandler デリゲート

ArrayConverter クラス

AsyncCompletedEventArgs クラス

AsyncCompletedEventHandler デリゲート

AsyncOperation クラス

AsyncOperationManager クラス

AttributeCollection クラス

BackgroundWorker クラス

BaseNumberConverter クラス

BindingList<T> クラス

BooleanConverter クラス

ByteConverter クラス

CancelEventArgs クラス

CancelEventHandler デリゲート

CharConverter クラス

CollectionChangeEventArgs クラス

CollectionChangeEventHandler デリゲート

CollectionConverter クラス

ComponentCollection クラス

ComponentConverter クラス

ComponentEditor クラス

ComponentResourceManager クラス

Container クラス

ContainerFilterService クラス

CultureInfoConverter クラス

CustomTypeDescriptor クラス

DateTimeConverter クラス

DecimalConverter クラス

ActiveDesignerEventArgs クラス

ActiveDesignerEventHandler デリゲート

CheckoutException クラス

CommandID クラス

ComponentChangedEventArgs クラス

ComponentChangedEventHandler デリゲート

ComponentChangingEventArgs クラス

ComponentChangingEventHandler デリゲート

ComponentEventArgs クラス

ComponentEventHandler デリゲート

ComponentRenameEventArgs クラス

ComponentRenameEventHandler デリゲート

DesignerCollection クラス

DesignerEventArgs クラス

DesignerEventHandler デリゲート

DesignerOptionService クラス

DesignerTransaction クラス

DesignerTransactionCloseEventArgs クラス

DesignerTransactionCloseEventHandler デリゲート

DesignerVerb クラス

DesignerVerbCollection クラス

DesigntimeLicenseContext クラス

DesigntimeLicenseContextSerializer クラス

MenuCommand クラス

ComponentSerializationService クラス

ContextStack クラス

DesignerLoader クラス

InstanceDescriptor クラス

MemberRelationshipService クラス

ResolveNameEventArgs クラス

ResolveNameEventHandler デリゲート

SerializationStore クラス

ServiceContainer クラス

ServiceCreatorCallback デリゲート

StandardCommands クラス

StandardToolWindows クラス

DoubleConverter クラス

DoWorkEventArgs クラス

DoWorkEventHandler デリゲート

EnumConverter クラス

EventDescriptor クラス

EventDescriptorCollection クラス

EventHandlerList クラス

ExpandableObjectConverter クラス

HandledEventArgs クラス

HandledEventHandler デリゲート

InstanceCreationEditor クラス

Int16Converter クラス

Int32Converter クラス

Int64Converter クラス

InvalidAsynchronousStateException クラス

InvalidEnumArgumentException クラス

BeginInvoke メソッド

License クラス

LicenseContext クラス

LicenseException クラス

LicenseManager クラス

LicenseProvider クラス

LicFileLicenseProvider クラス

ListChangedEventArgs クラス

ListChangedEventHandler デリゲート

ListSortDescription クラス

ListSortDescriptionCollection クラス

MaskedTextProvider クラス

MemberDescriptor クラス

MultilineStringConverter クラス

NestedContainer クラス

NullableConverter クラス

ProgressChangedEventArgs クラス

ProgressChangedEventHandler デリゲート

PropertyChangedEventArgs クラス

PropertyChangedEventHandler デリゲート

PropertyDescriptor クラス

PropertyDescriptorCollection クラス

ReferenceConverter クラス

RefreshEventArgs クラス

RefreshEventHandler デリゲート

RunWorkerCompletedEventArgs クラス

RunWorkerCompletedEventHandler デリゲート

SByteConverter クラス

SingleConverter クラス

StringConverter クラス

SyntaxCheck クラス

TimeSpanConverter クラス

TypeConverter クラス

TypeDescriptionProvider クラス

TypeDescriptor クラス

TypeListConverter クラス

UInt16Converter クラス

UInt32Converter クラス

UInt64Converter クラス

WarningException クラス

Win32Exception クラス

System.Diagnostics

Debug.Listeners プロパティ

Trace.Listeners プロパティ

EventLog.SynchronizingObject プロパティ

ConsoleTraceListener クラス

DefaultTraceListener クラス

DelimitedListTraceListener クラス

EventLogTraceListener クラス

PerformanceCounter クラス

PerformanceCounterCategory クラス

Process クラス

ProcessStartInfo クラス

TextWriterTraceListener クラス

TraceListener クラス

XmlWriterTraceListener クラス

TraceSource.Listeners プロパティ

System.IO

Stream.Synchronized メソッド

TextReader.Synchronized メソッド

TextWriter.Synchronized メソッド

System.Reflection.Emit

ConstructorBuilder クラス

EventBuilder クラス

FieldBuilder クラス

MethodBuilder クラス

CustomAttributeBuilder クラス

MethodRental クラス

ModuleBuilder クラス

PropertyBuilder クラス

TypeBuilder クラス

UnmanagedMarshal クラス

System.Text

Group.Synchronized メソッド

Match.Synchronized メソッド

System.Threading

AutoResetEvent クラス

EventWaitHandle クラス

ManualResetEvent クラス

Monitor クラス

Mutex クラス

ReaderWriterLock クラス

Semaphore クラス

Thread.AllocateNamedDataSlot メソッド

Thread.BeginCriticalRegion メソッド

Thread.EndCriticalRegion メソッド

Thread.FreeNamedDataSlot メソッド

Thread.GetData メソッド

Thread.Join メソッド

Thread.SetApartmentState メソッド

Thread.SetData メソッド

Thread.SpinWait メソッド

Thread.Start メソッド

Thread.TrySetApartmentState メソッド

ThreadPool クラス

Timer クラス

System.Timers

Timer クラス

System.Web.Configuration

MachineKeyValidationConverter クラス

System.Windows.Forms

AutoCompleteStringCollection.SyncRoot プロパティ

SQL Server アクセス許可セット

SQL Server では、データベースに配置されるコードの信頼性要件をユーザーが指定できます。 アセンブリをデータベースにアップロードする際に、アセンブリの作成者は、そのアセンブリのアクセス許可セットとして、SAFE、EXTERNAL-ACCESS、UNSAFE の 3 つのうちのいずれかを指定できます。

アクセス許可セット

SAFE

EXTERNAL-ACCESS

UNSAFE

コード アクセス セキュリティ

実行のみ

実行 + 外部リソースへのアクセス

制限なし

プログラミング モデルの制限

制限なし

検証可能性の要求

ネイティブ コードの呼び出し

×

×

SAFE は、許可されるプログラミング モデルに関連付けられている制限を持つ、最も信頼できる安全なモードです。 SAFE コードは、高い信頼性とセキュリティ機能を備えています。 SAFE アセンブリには、動作、計算の実行、およびローカル データベースへのアクセスに関して十分なアクセス許可が与えられます。 SAFE アセンブリは、検証可能という点でタイプ セーフである必要があり、アンマネージ コードを呼び出すことができません。

EXTERNAL-ACCESS は中間的なセキュリティ オプションであり、コードに対してデータベース外部のリソースへのアクセスを許可しますが、SAFE と同じ信頼性と安全性を備えています。

UNSAFE は、データベース管理者のみが作成できる信頼性の高いコードを対象にしています。 この信頼されたコードにはコード アクセス制限がなく、アンマネージ (ネイティブ) コードを呼び出すことができます。

SQL Server では、ホスト レベルのコード アクセス セキュリティ ポリシー レイヤーを使って、SQL Server カタログに格納されているアクセス許可セットを基に 3 つのアクセス許可セットのいずれかを付与するホスト ポリシーを設定します。 データベース内部で動作するマネージ コードは、常にこれらのコード アクセス許可セットのいずれかを取得します。

プログラミング モデルの制限

SQL Server におけるマネージ コードのプログラミング モデルでは、複数の呼び出しにまたがって保持される状態を使用したり、複数のユーザー セッションにまたがって状態を共有したりする必要がない関数、プロシージャ、および型が必要です。 さらに、前述したように共有状態が存在すると、アプリケーションのスケーラビリティと信頼性に影響する重大な例外が発生する可能性があります。

これらの考慮事項により、SQL Server では、静的変数と静的データ メンバーを使用できません。 SAFE アセンブリや EXTERNAL-ACCESS アセンブリでは、SQL Server は、CREATE ASSEMBLY の実行時にアセンブリのメタデータを調べ、静的データ メンバーや静的変数の使用が認められた場合には、これらのアセンブリを作成しません。

参照

参照

HostProtectionAttribute

HostProtectionResource