SQL Server 编程和宿主保护特性

在 SQL Server 主机中加载和执行托管代码需要满足主机对代码访问安全性和主机资源保护的要求。 代码访问安全性要求由三个 SQL Server 权限集(SAFE、EXTERNAL-ACCESS 或 UNSAFE)其中之一指定。 在 SAFE 或 EXTERNAL-ACCESS 权限集内执行的代码必须避免某些类型或应用了 HostProtectionAttribute 属性的成员。 HostProtectionAttribute 不是可靠性保证的安全权限,因为它标识主机可能禁止的特定代码结构(类型或方法)。 使用 HostProtectionAttribute 会强制执行可帮助保护宿主稳定性的编程模型。

注意

代码访问安全性 (CAS) 已在所有版本的 .NET Framework 和 .NET 中弃用。 如果使用与 CAS 相关的 API,最新版本的 .NET 不会遵循 CAS 注释,并会生成错误。 开发人员应寻求用于完成安全任务的替代方法。

宿主保护属性

主机保护属性识别不符合主机编程模型的类型或成员,并表示以下级别的可靠性威胁:

  • 在其他方面为良性。

  • 可能会导致反序列化服务器托管的用户代码。

  • 可能会导致反序列化服务器进程本身。

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
代码访问安全性 仅执行 执行和访问外部资源 非受限
编程模型限制 无限制
可验证性要求
调用本机代码的能力 No

SAFE 是最可靠和安全的模式,并且在允许的编程模型方面也具有相关的限制。 SAFE 代码具有高可靠性和安全性功能。 给 SAFE 程序集授予了足够的权限,以便运行、执行计算以及访问本地数据库。 SAFE 程序集需要具有可验证的类型安全性,并且不允许调用非托管代码。

EXTERNAL-ACCESS 提供了一个中间安全选项,允许代码访问数据库外部的资源,但仍具有 SAFE 的可靠性和安全性。

UNSAFE 用于仅能由数据库管理员创建的高度受信任的代码。 这类信任代码没有代码访问限制,可以调用非托管(本机)代码。

SQL Server 使用主机级别代码访问安全策略层来设置主机策略,此策略根据 SQL Server 目录中存储的权限集授予三组权限之一。 在数据库内运行的托管代码始终获取这些代码访问权限集中的一个。

编程模型限制

SQL Server 中托管代码的编程模型需要无需使用跨多个调用的状态保留或跨多个用户会话共享状态的功能、过程和类型。 而且,如前文所述,共享状态的存在可导致能够影响应用程序的可伸缩性和可靠性的严重异常。

考虑到这些因素,SQL Server 不允许使用静态变量和静态数据成员。 对于 SAFE 和 EXTERNAL-ACCESS 程序集,SQL Server 将在 CREATE ASSEMBLY 时间检查程序集的元数据,如果发现使用静态数据成员和变量,则无法创建此类程序集。

请参阅