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 的类型或成员,该属性指定 HostProtectionResource、SharedState、Synchronization 或 MayLeakOnAbort 的 ExternalProcessMgmt 值。 这样可以有效防止程序集调用那些会启用共享状态、执行同步、在终止时可能导致资源泄漏或影响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 是最可靠和安全的模式,并且在允许的编程模型方面也具有相关的限制。 SAFE 代码具有较高的可靠性和安全功能。 给 SAFE 程序集授予了足够的权限,以便运行、执行计算以及访问本地数据库。 SAFE 程序集需要具有可验证的类型安全性,并且不允许调用非托管代码。

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

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

SQL Server 使用主机级代码访问安全策略层设置主机策略,该策略根据 SQL Server 目录中存储的权限集授予这三组权限之一。 在数据库中运行的托管代码会得到这些代码访问权限集中的一个。

编程模型限制

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

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

另请参阅