программирование SQL Server и атрибуты защиты ведущего приложенияSQL Server Programming and Host Protection Attributes

Чтобы загружать и выполнять управляемый код, ведущее приложение SQL Server должно соответствовать требованиям ведущего приложения к управлению доступом для кода и защите ресурсов ведущего приложения.The ability to load and execute managed code in a SQL Server host requires meeting the host's requirements for both code access security and host resource protection. Требования к безопасности доступа кода применяется один из трех наборов разрешений SQL Server: SAFE, EXTERNAL-ACCESS или UNSAFE.The code access security requirements are specified by one of three SQL Server permission sets: SAFE, EXTERNAL-ACCESS, or UNSAFE. В коде, выполняемом с набором разрешений SAFE или EXTERNAL-ACCESS, не рекомендуется использовать определенные типы и члены, к которым применен атрибут HostProtectionAttribute.Code executing within the SAFE or EXTERNAL-ACCESS permission sets must avoid certain types or members that have the HostProtectionAttribute attribute applied. Атрибут HostProtectionAttribute не является разрешением безопасности в той же степени, что и гарантия надежности, поскольку в нем определяются конкретные конструкции кода (типы или методы), которые ведущее приложение может запрещать.The HostProtectionAttribute is not a security permission as much as a reliability guarantee in that it identifies specific code constructs, either types or methods, that the host may disallow. С помощью атрибута HostProtectionAttribute можно реализовать модель программирования, которая позволяет гарантировать стабильность работы ведущего приложения.The use of the HostProtectionAttribute enforces a programming model that helps protect the stability of the host.

Атрибуты защиты ведущего приложенияHost Protection Attributes

Атрибуты защиты ведущего приложения определяют типы и члены, которые не соответствуют модели программирования ведущего приложения, и представляют следующие уровни угроз надежности (по возрастанию):Host protection attributes identify types or members that do not fit the host programming model and represent the following increasing levels of reliability threat:

  • Во всех остальных случаях является безопасным.Are otherwise benign.

  • Может привести к дестабилизации пользовательского кода, находящегося под управлением сервера.Could lead to destabilization of server-managed user code.

  • Может привести к дестабилизации самого процесса сервера.Could lead to destabilization of the server process itself.

SQL Server не поддерживает использование типов или членов с атрибутом HostProtectionAttribute, которые задают значения HostProtectionResource, равные SharedState, Synchronization, MayLeakOnAbort или ExternalProcessMgmt.SQL Server disallows the use of a type or member that has a HostProtectionAttribute that specifies a HostProtectionResource value of SharedState, Synchronization, MayLeakOnAbort, or ExternalProcessMgmt. Таким образом, сборки не могут вызывать члены, которые активируют общее состояние, выполняют синхронизацию, могут привести к утечке ресурсов при завершении или влияют на целостность процесса SQL Server.This prevents the assemblies from calling members that enable sharing state, perform synchronization, might cause a resource leak on termination, or affect the integrity of the SQL Server process.

Запрещенные типы и членыDisallowed Types and Members

В следующей таблице указаны типы и члены, значения HostProtectionResource которых запрещены в SQL Server.The following table identifies types and members whose HostProtectionResource values are disallowed by SQL Server.

Пространство именNamespace Тип или членType or member
Microsoft.Win32 Класс PowerModeChangedEventArgsPowerModeChangedEventArgs class

Делегат PowerModeChangedEventHandlerPowerModeChangedEventHandler delegate

Класс SessionEndedEventArgsSessionEndedEventArgs class

Делегат SessionEndedEventHandlerSessionEndedEventHandler delegate

Класс SessionEndingEventArgsSessionEndingEventArgs class

Делегат SessionEndingEventHandlerSessionEndingEventHandler delegate

Класс SessionSwitchEventArgsSessionSwitchEventArgs class

Делегат SessionSwitchEventHandlerSessionSwitchEventHandler delegate

Класс SystemEventsSystemEvents class

Класс TimerElapsedEventArgsTimerElapsedEventArgs class

Делегат TimerElapsedEventHandlerTimerElapsedEventHandler delegate

Класс UserPreferenceChangedEventArgsUserPreferenceChangedEventArgs class

Класс UserPreferenceChangingEventArgsUserPreferenceChangingEventArgs class
System.Collections Метод ArrayList.SynchronizedArrayList.Synchronized method

Метод Hashtable.SynchronizedHashtable.Synchronized method

Метод Queue.SynchronizedQueue.Synchronized method

Метод SortedList.SynchronizedSortedList.Synchronized method

Метод Stack.SynchronizedStack.Synchronized method
System.ComponentModel Класс AddingNewEventArgsAddingNewEventArgs class

Делегат AddingNewEventHandlerAddingNewEventHandler delegate

Класс ArrayConverterArrayConverter class

Класс AsyncCompletedEventArgsAsyncCompletedEventArgs class

Делегат AsyncCompletedEventHandlerAsyncCompletedEventHandler delegate

Класс AsyncOperationAsyncOperation class

Класс AsyncOperationManagerAsyncOperationManager class

Класс AttributeCollectionAttributeCollection class

Класс BackgroundWorkerBackgroundWorker class

Класс BaseNumberConverterBaseNumberConverter class

Класс BindingList<T>BindingList<T> class

Класс BooleanConverterBooleanConverter class

Класс ByteConverterByteConverter class

Класс CancelEventArgsCancelEventArgs class

Делегат CancelEventHandlerCancelEventHandler delegate

Класс CharConverterCharConverter class

Класс CollectionChangeEventArgsCollectionChangeEventArgs class

Делегат CollectionChangeEventHandlerCollectionChangeEventHandler delegate

Класс CollectionConverterCollectionConverter class

Класс ComponentCollectionComponentCollection class

Класс ComponentConverterComponentConverter class

Класс ComponentEditorComponentEditor class

Класс ComponentResourceManagerComponentResourceManager class

Класс ContainerContainer class

Класс ContainerFilterServiceContainerFilterService class

Класс CultureInfoConverterCultureInfoConverter class

Класс CustomTypeDescriptorCustomTypeDescriptor class

Класс DateTimeConverterDateTimeConverter class

Класс DecimalConverterDecimalConverter class

Класс ActiveDesignerEventArgsActiveDesignerEventArgs class

Делегат ActiveDesignerEventHandlerActiveDesignerEventHandler delegate

Класс CheckoutExceptionCheckoutException class

Класс CommandIDCommandID class

Класс ComponentChangedEventArgsComponentChangedEventArgs class

Делегат ComponentChangedEventHandlerComponentChangedEventHandler delegate

Класс ComponentChangingEventArgsComponentChangingEventArgs class

Делегат ComponentChangingEventHandlerComponentChangingEventHandler delegate

Класс ComponentEventArgsComponentEventArgs class

Делегат ComponentEventHandlerComponentEventHandler delegate

Класс ComponentRenameEventArgsComponentRenameEventArgs class

Делегат ComponentRenameEventHandlerComponentRenameEventHandler delegate

Класс DesignerCollectionDesignerCollection class

Класс DesignerEventArgsDesignerEventArgs class

Делегат DesignerEventHandlerDesignerEventHandler delegate

Класс DesignerOptionServiceDesignerOptionService class

Класс DesignerTransactionDesignerTransaction class

Класс DesignerTransactionCloseEventArgsDesignerTransactionCloseEventArgs class

Делегат DesignerTransactionCloseEventHandlerDesignerTransactionCloseEventHandler delegate

Класс DesignerVerbDesignerVerb class

Класс DesignerVerbCollectionDesignerVerbCollection class

Класс DesigntimeLicenseContextDesigntimeLicenseContext class

Класс DesigntimeLicenseContextSerializerDesigntimeLicenseContextSerializer class

Класс MenuCommandMenuCommand class

Класс ComponentSerializationServiceComponentSerializationService class

Класс ContextStackContextStack class

Класс DesignerLoaderDesignerLoader class

Класс InstanceDescriptorInstanceDescriptor class

Класс MemberRelationshipServiceMemberRelationshipService class

Класс ResolveNameEventArgsResolveNameEventArgs class

Делегат ResolveNameEventHandlerResolveNameEventHandler delegate

Класс SerializationStoreSerializationStore class

Класс ServiceContainerServiceContainer class

Делегат ServiceCreatorCallbackServiceCreatorCallback delegate

Класс StandardCommandsStandardCommands class

Класс StandardToolWindowsStandardToolWindows class

Класс DoubleConverterDoubleConverter class

Класс DoWorkEventArgsDoWorkEventArgs class

Делегат DoWorkEventHandlerDoWorkEventHandler delegate

Класс EnumConverterEnumConverter class

Класс EventDescriptorEventDescriptor class

Класс EventDescriptorCollectionEventDescriptorCollection class

Класс EventHandlerListEventHandlerList class

Класс ExpandableObjectConverterExpandableObjectConverter class

Класс HandledEventArgsHandledEventArgs class

Делегат HandledEventHandlerHandledEventHandler delegate

Класс InstanceCreationEditorInstanceCreationEditor class

Класс Int16ConverterInt16Converter class

Класс Int32ConverterInt32Converter class

Класс Int64ConverterInt64Converter class

Класс InvalidAsynchronousStateExceptionInvalidAsynchronousStateException class

Класс InvalidEnumArgumentExceptionInvalidEnumArgumentException class

Метод BeginInvokeBeginInvoke method

Класс LicenseLicense class

Класс LicenseContextLicenseContext class

Класс LicenseExceptionLicenseException class

Класс LicenseManagerLicenseManager class

Класс LicenseProviderLicenseProvider class

Класс LicFileLicenseProviderLicFileLicenseProvider class

Класс ListChangedEventArgsListChangedEventArgs class

Делегат ListChangedEventHandlerListChangedEventHandler delegate

Класс ListSortDescriptionListSortDescription class

Класс ListSortDescriptionCollectionListSortDescriptionCollection class

Класс MaskedTextProviderMaskedTextProvider class

Класс MemberDescriptorMemberDescriptor class

Класс MultilineStringConverterMultilineStringConverter class

Класс NestedContainerNestedContainer class

Класс NullableConverterNullableConverter class

Класс ProgressChangedEventArgsProgressChangedEventArgs class

Делегат ProgressChangedEventHandlerProgressChangedEventHandler delegate

Класс PropertyChangedEventArgsPropertyChangedEventArgs class

Делегат PropertyChangedEventHandlerPropertyChangedEventHandler delegate

Класс PropertyDescriptorPropertyDescriptor class

Класс PropertyDescriptorCollectionPropertyDescriptorCollection class

Класс ReferenceConverterReferenceConverter class

Класс RefreshEventArgsRefreshEventArgs class

Делегат RefreshEventHandlerRefreshEventHandler delegate

Класс RunWorkerCompletedEventArgsRunWorkerCompletedEventArgs class

Делегат RunWorkerCompletedEventHandlerRunWorkerCompletedEventHandler delegate

Класс SByteConverterSByteConverter class

Класс SingleConverterSingleConverter class

Класс StringConverterStringConverter class

Класс SyntaxCheckSyntaxCheck class

Класс TimeSpanConverterTimeSpanConverter class

Класс TypeConverterTypeConverter class

Класс TypeDescriptionProviderTypeDescriptionProvider class

Класс TypeDescriptorTypeDescriptor class

Класс TypeListConverterTypeListConverter class

Класс UInt16ConverterUInt16Converter class

Класс UInt32ConverterUInt32Converter class

Класс UInt64ConverterUInt64Converter class

Класс WarningExceptionWarningException class

Класс Win32ExceptionWin32Exception class
System.Diagnostics Свойство Debug.ListenersDebug.Listeners property

Свойство Trace.ListenersTrace.Listeners property

Свойство EventLog.SynchronizingObjectEventLog.SynchronizingObject property

Класс ConsoleTraceListenerConsoleTraceListener class

Класс DefaultTraceListenerDefaultTraceListener class

Класс DelimitedListTraceListenerDelimitedListTraceListener class

Класс EventLogTraceListenerEventLogTraceListener class

Класс PerformanceCounterPerformanceCounter class

Класс PerformanceCounterCategoryPerformanceCounterCategory class

Класс ProcessProcess class

Класс ProcessStartInfoProcessStartInfo class

Класс TextWriterTraceListenerTextWriterTraceListener class

Класс TraceListenerTraceListener class

Класс XmlWriterTraceListenerXmlWriterTraceListener class

Свойство TraceSource.ListenersTraceSource.Listeners property
System.IO Метод Stream.SynchronizedStream.Synchronized method

Метод TextReader.SynchronizedTextReader.Synchronized method

Метод TextWriter.SynchronizedTextWriter.Synchronized method
System.Reflection.Emit Класс ConstructorBuilderConstructorBuilder class

Класс EventBuilderEventBuilder class

Класс FieldBuilderFieldBuilder class

Класс MethodBuilderMethodBuilder class

Класс CustomAttributeBuilderCustomAttributeBuilder class

Класс MethodRentalMethodRental class

Класс ModuleBuilderModuleBuilder class

Класс PropertyBuilderPropertyBuilder class

Класс TypeBuilderTypeBuilder class

Класс UnmanagedMarshalUnmanagedMarshal class
System.Text Метод Group.SynchronizedGroup.Synchronized method

Метод Match.SynchronizedMatch.Synchronized method
System.Threading Класс AutoResetEventAutoResetEvent class

Класс EventWaitHandleEventWaitHandle class

Класс ManualResetEventManualResetEvent class

Класс MonitorMonitor class

Класс MutexMutex class

Класс ReaderWriterLockReaderWriterLock class

Класс SemaphoreSemaphore class

Метод Thread.AllocateNamedDataSlotThread.AllocateNamedDataSlot method

Метод Thread.BeginCriticalRegionThread.BeginCriticalRegion method

Метод Thread.EndCriticalRegionThread.EndCriticalRegion method

Метод Thread.FreeNamedDataSlotThread.FreeNamedDataSlot method

Метод Thread.GetDataThread.GetData method

Метод Thread.JoinThread.Join method

Метод Thread.SetApartmentStateThread.SetApartmentState method

Метод Thread.SetDataThread.SetData method

Метод Thread.SpinWaitThread.SpinWait method

Метод Thread.StartThread.Start method

Метод Thread.TrySetApartmentStateThread.TrySetApartmentState method

Класс ThreadPoolThreadPool class

Класс TimerTimer class
System.Timers Класс TimerTimer class
System.Web.Configuration Класс MachineKeyValidationConverterMachineKeyValidationConverter class
System.Windows.Forms Свойство AutoCompleteStringCollection.SyncRootAutoCompleteStringCollection.SyncRoot property

Наборы разрешений SQL ServerSQL Server Permission Sets

SQL Server позволяет пользователям задавать требования к надежности кода, развернутого в базе данных.SQL Server allows users to specify the reliability requirements for code deployed into a database. При загрузке сборок в базе данных, автор сборки можно указать один из трех наборов разрешений для этой сборки: SAFE, EXTERNAL-ACCESS или UNSAFE.When assemblies are uploaded into the database, the author of the assembly can specify one of three permission sets for that assembly: SAFE, EXTERNAL-ACCESS, or UNSAFE.

Набор разрешенийPermission set SAFESAFE EXTERNAL-ACCESSEXTERNAL-ACCESS UNSAFEUNSAFE
Управление доступом для кодаCode access security Только выполнениеExecute only Выполнение и доступ к внешним ресурсамExecute + access to external resources Без ограниченийUnrestricted
Ограничения модели программированияProgramming model restrictions ДаYes ДаYes Без ограниченийNo restrictions
Требование к проверяемостиVerifiability requirement ДаYes ДаYes НетNo
Возможность вызова машинного кодаAbility to call native code НетNo НетNo ДаYes

Режим SAFE является наиболее надежным и безопасным с соответствующими ограничениями в отношении разрешенной модели программирования.SAFE is the most reliable and secure mode with associated restrictions in terms of the allowed programming model. Код с разрешениями SAFE имеет самый высокий уровень надежности и безопасности.SAFE code has high reliability and security features. Сборки с разрешениями SAFE получают разрешение на выполнение, проведение вычислений и доступ к локальной базе данных.SAFE assemblies are given enough permission to run, perform computations, and have access to the local database. Сборки с разрешениями SAFE должны иметь возможность проверки типобезопасности и не могут вызывать неуправляемый код.SAFE assemblies need to be verifiably type safe and are not allowed to call unmanaged code.

Набор разрешений EXTERNAL-ACCESS представляет собой промежуточный вариант в контексте безопасности. Он разрешает коду доступ к внешним по отношению к базе данных ресурсам, но при этом по-прежнему обеспечивает уровень надежности и безопасности, соответствующий разрешениям SAFE.EXTERNAL-ACCESS provides an intermediate security option, allowing code to access resources external to the database but still having the reliability and safety of SAFE.

Режим UNSAFE предназначен для кода с высоким уровнем доверия, который может создаваться только администраторами базы данных.UNSAFE is for highly trusted code that can only be created by database administrators. Этот доверенный код не имеет ограничений на управление доступом к коду и может вызывать неуправляемый (машинный) код.This trusted code has no code access restrictions, and it can call unmanaged (native) code.

SQL Server использует уровень политики управления доступом к коду на уровне ведущего приложения для настройки политики ведущего приложения, которая предоставляет один из трех наборов разрешений на основе наборов, которые хранятся в каталогах SQL Server.SQL Server uses the host-level code access security policy layer to set up a host policy that grants one of the three sets of permissions based on the permission set stored in SQL Server catalogs. Управляемый код, выполняемый в базе данных, всегда получает один из этих наборов разрешений на управление доступом к коду.Managed code running inside the database always gets one of these code access permission sets.

Ограничения модели программированияProgramming Model Restrictions

В модели программирования SQL Server должны применяться функции, процедуры и типы, которые не требуют удержания состояния для нескольких вызовов или использования общего состояния для нескольких пользовательских сеансов.The programming model for managed code in SQL Server requires functions, procedures, and types which do not require the use of state held across multiple invocations or the sharing of state across multiple user sessions. Кроме того, как было описано ранее, наличие общего состояние может привести к возникновению критических исключений, которые повлияют на масштабируемость и надежность приложения.Further, as described earlier, the presence of shared state can cause critical exceptions that impact the scalability and the reliability of the application.

Исходя из этого, SQL Server не поддерживает использование статических переменных и статических членов данных.Given these considerations, SQL Server disallows the use of static variables and static data members. Для сборок с разрешениями SAFE и EXTERNAL-ACCESS SQL Server проверяет метаданные сборки во время СОЗДАНИЯ СБОРКИ и возвращает состояние сбоя, если в ней используются статические переменные и члены данных.For SAFE and EXTERNAL-ACCESS assemblies, SQL Server examines the metadata of the assembly at CREATE ASSEMBLY time, and fails the creation of such assemblies if it finds the use of static data members and variables.

См. такжеSee also