共用方式為


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`、`SharedState`、`Synchronization` 或 `MayLeakOnAbort` 的型別或成員。 這可防止組件呼叫可啟用共用狀態、執行同步處理、可能造成終止時資源流失,或影響 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。

許可權集合 安全 EXTERNAL-ACCESS 不安全的
代碼存取安全性 僅限執行 執行 + 存取外部資源 不受限制
程序設計模型限制 是的 是的 沒有限制
可驗證性需求 是的 是的
呼叫原生程式碼的能力 是的

SAFE 是最可靠且安全的模式,並且在允許的程式設計模型方面有相關限制。 SAFE 程式代碼具有高度可靠性和安全性功能。 SAFE 組件有足夠的權限來執行、執行計算,以及存取本機資料庫。 SAFE 組件必須是可驗證的型別安全,且不允許呼叫 Unmanaged 程式碼。

EXTERNAL-ACCESS 提供中繼安全性選項,允許程式代碼存取資料庫外部的資源,但仍具有 SAFE 的可靠性和安全性。

UNSAFE 適用於只能由資料庫管理員建立的高度信任程式碼。 此信任的程式代碼沒有程式代碼存取限制,而且可以呼叫非受控原生程式代碼。

SQL Server 會使用主機層級程式代碼存取安全策略層來設定主機原則,根據儲存在 SQL Server 目錄中的許可權集,授與三組許可權的其中一個。 在資料庫內執行的 Managed 程式碼一律會取得這些程式碼存取權限集合的其中一個。

程式設計模型限制

SQL Server 中的受控代碼程式設計模型需要不依賴於多次調用之間的狀態或多個使用者會話間共享狀態的函數、程序和類型。 此外,如先前所述,共用狀態的存在可能會導致嚴重的例外狀況,影響應用程式的延展性和可靠性。

鑒於這些考慮,SQL Server 不允許使用靜態變數和靜態數據成員。 針對 SAFE 和 EXTERNAL-ACCESS 元件,SQL Server 會在 CREATE ASSEMBLY 時間檢查元件的元數據,如果找到靜態數據成員和變數的使用,則無法建立這類元件。

另請參閱