SQL Server 程式設計和主機保護屬性

在 SQL Server 主應用程式中載入及執行 Managed 程式碼的能力,需要符合主應用程式對於程式碼存取安全性和主應用程式資源保護的需求。 程式碼存取安全性的需求是由下列三個 SQL Server 使用權限集合的其中一個所指定:SAFE、EXTERNAL-ACCESS 或 UNSAFE。 在 SAFE 或 EXTERNAL-ACCESS 使用權限集合內執行的程式碼,必須避免某些已套用 HostProtectionAttribute 屬性的型別或成員。 HostProtectionAttribute 並不是和可靠性保證同等的安全性權限,因為它會識別主應用程式可能不允許的特定程式碼建構 (型別或方法)。 使用 HostProtectionAttribute 會強制使用有助於保護主應用程式之穩定性的程式設計模型。

主應用程式保護屬性

主應用程式保護屬性可識別不適合主應用程式設計模型以及表示下列可靠性威脅等級提高的型別或成員:

  • 否則為良性。

  • 可能會導致受伺服器管理之使用者程式碼不穩定。

  • 可能會導致伺服器處理序本身的不穩定。

SQL Server 不允許使用具有 HostProtectionAttribute (會指定 SharedStateSynchronizationMayLeakOnAbortExternalProcessMgmtHostProtectionResource 值) 的型別或成員。 這會讓組件無法呼叫啟用共用狀態、執行同步處理、在終止時可能造成資源流失、或是會影響 SQL Server 處理序完整性的成員。

不允許的型別和成員

下表將識別一些型別和成員,SQL Server 不允許使用它們的 HostProtectionResource 值。

命名空間

型別或成員

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。

使用權限集合

SAFE

EXTERNAL-ACCESS

UNSAFE

程式碼存取安全性

僅限執行

執行 + 存取外部資源

不受限

程式設計模型限制

無限制

可驗證性需求

呼叫機器碼的能力

SAFE 是最可靠及安全的模式,其包含了根據允許的程式設計模型的相關限制。 SAFE 程式碼具有高可靠性和安全性功能; SAFE 組件有被授與足夠的權限來執行、進行運算,以及存取本機資料庫。 SAFE 組件需要是可驗證的型別安全組件,且不允許呼叫 Unmanaged 程式碼。

EXTERNAL-ACCESS 提供了中級安全性選項,可讓程式碼存取在資料庫外部的資源,但是仍然保有 SAFE 的可靠性和安全性。

UNSAFE 適用於高度信任的程式碼,這類程式碼只能由資料庫管理員建立; 此信任的程式碼沒有程式碼存取的限制,且可以呼叫 Unmanaged 程式碼 (機器碼)。

SQL Server 使用主應用程式層級的程式碼存取安全性原則層來設定主應用程式原則,以根據 SQL Server 資料庫目錄中所儲存的使用權限集合來授與三個使用權限集合當中的一個。 在資料庫內執行的 Managed 程式碼一定會取得這些程式碼存取使用權限集合當中的一個。

程式設計模型限制

SQL Server 中 Managed 程式碼的程式設計模型需要有函式、程序和型別,而這些項目不需要使用跨多個引動過程之間所保有的狀態或是共用跨多個使用者工作階段的狀態。 再者,如之前所述,共用狀態的存在可能會造成嚴重的例外狀況,而這些例外狀況會影響應用程式的延展性和可靠性。

基於這些考量,SQL Server 不允許使用靜態變數和靜態資料成員。 對於 SAFE 和 EXTERNAL-ACCESS 組件而言,SQL Server 會在建立組件時檢查組件的中繼資料;如果有找到靜態資料成員和變數的使用,則會讓這類組件的建立作業失敗。

請參閱

參考

HostProtectionAttribute

HostProtectionResource