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

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

注意

在所有版本的 .NET Framework 與 .NET 中,程式碼存取安全性 (CAS) 均已被取代。 當使用 CAS 相關 API 時,最新版本的 .NET 不會接受 CAS 註釋,並會產生錯誤。 開發人員應尋求替代方案來完成安全性工作。

主機保護屬性

主機保護屬性可識別不適合主機程式設計模型的類型或成員,並且代表下列遞增的可靠性威脅層級:

  • 不是良性。

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

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

SQL Server 不允許使用具有 HostProtectionAttribute 且其 HostProtectionResource 值指定為 SharedStateSynchronizationMayLeakOnAbortExternalProcessMgmt 的類型或成員。 這可防止組件呼叫可啟用共用狀態、執行同步處理、可能造成終止時資源流失,或影響 SQL Server 程序完整性的成員。

不允許的類型和成員

下表提供 SQL Server 不允許其 HostProtectionResource 值的類型和成員。

Namespace 類型或成員
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
程式碼存取安全性 僅限執行 執行 + 存取外部資源 不受限制
程式設計模型限制 Yes Yes 無限制
可驗證性需求 Yes .是 No
呼叫原生程式碼的能力 No Yes

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 會在 CREATE ASSEMBLY 時,檢查組件的中繼資料,並且如果它找到使用靜態資料成員和變數,便讓這類組件的建立作業失敗。

另請參閱