Programação em SQL Server e atributos de proteção de hostSQL Server Programming and Host Protection Attributes

A capacidade de carregar e executar um código gerenciado em um host do SQL Server exige que os requisitos do host referentes à segurança de acesso do código e à proteção de recursos do host sejam atendidos.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. Os requisitos de segurança de acesso do código são especificados por um dos três conjuntos de permissões do SQL Server: SAFE, EXTERNAL-ACCESS ou UNSAFE.The code access security requirements are specified by one of three SQL Server permission sets: SAFE, EXTERNAL-ACCESS, or UNSAFE. O código em execução nos conjuntos de permissões SAFE ou EXTERNAL-ACCESS devem evitar determinados tipos ou membros que têm o atributo HostProtectionAttribute aplicado.Code executing within the SAFE or EXTERNAL-ACCESS permission sets must avoid certain types or members that have the HostProtectionAttribute attribute applied. O HostProtectionAttribute não é uma permissão de segurança como uma garantia de confiabilidade, pois ele identifica constructos de código específicos, sejam tipos ou métodos, que o host pode não permitir.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. O uso do HostProtectionAttribute impõe um modelo de programação que ajuda a proteger a estabilidade do host.The use of the HostProtectionAttribute enforces a programming model that helps protect the stability of the host.

Atributos de proteção de hostHost Protection Attributes

Os atributos de proteção do host identificam tipos ou membros que não se ajustam ao modelo de programação do host e representam os seguintes níveis cada vez maiores de ameaça à confiabilidade:Host protection attributes identify types or members that do not fit the host programming model and represent the following increasing levels of reliability threat:

  • Do contrário, benignos.Are otherwise benign.

  • Poderia levar à desestabilização do código de usuário gerenciado por servidor.Could lead to destabilization of server-managed user code.

  • Poderia levar à desestabilização do próprio processo do servidor.Could lead to destabilization of the server process itself.

O SQL Server não permite o uso de um tipo ou membro que tem um HostProtectionAttribute que especifica um valor HostProtectionResource igual a SharedState, Synchronization, MayLeakOnAbort ou 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. Isso impede que os assemblies chamem membros que permitem o compartilhamento do estado, executam a sincronização, podem causar uma perda de recursos após o término ou afetam a integridade do processo do 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.

Tipos e membros desaprovadosDisallowed Types and Members

A tabela a seguir identifica os tipos e membros cujos valores HostProtectionResource não são permitidos pelo SQL Server.The following table identifies types and members whose HostProtectionResource values are disallowed by SQL Server.

NamespaceNamespace Tipo ou membroType or member
Microsoft.Win32 Classe PowerModeChangedEventArgsPowerModeChangedEventArgs class

Representante PowerModeChangedEventHandlerPowerModeChangedEventHandler delegate

Classe SessionEndedEventArgsSessionEndedEventArgs class

Representante SessionEndedEventHandlerSessionEndedEventHandler delegate

Classe SessionEndingEventArgsSessionEndingEventArgs class

Representante SessionEndingEventHandlerSessionEndingEventHandler delegate

Classe SessionSwitchEventArgsSessionSwitchEventArgs class

Representante SessionSwitchEventHandlerSessionSwitchEventHandler delegate

Classe SystemEventsSystemEvents class

Classe TimerElapsedEventArgsTimerElapsedEventArgs class

Representante TimerElapsedEventHandlerTimerElapsedEventHandler delegate

Classe UserPreferenceChangedEventArgsUserPreferenceChangedEventArgs class

Classe UserPreferenceChangingEventArgsUserPreferenceChangingEventArgs class
System.Collections Método ArrayList.SynchronizedArrayList.Synchronized method

Método Hashtable.SynchronizedHashtable.Synchronized method

Método Queue.SynchronizedQueue.Synchronized method

Método SortedList.SynchronizedSortedList.Synchronized method

Método Stack.SynchronizedStack.Synchronized method
System.ComponentModel Classe AddingNewEventArgsAddingNewEventArgs class

Representante AddingNewEventHandlerAddingNewEventHandler delegate

Classe ArrayConverterArrayConverter class

Classe AsyncCompletedEventArgsAsyncCompletedEventArgs class

Representante AsyncCompletedEventHandlerAsyncCompletedEventHandler delegate

Classe AsyncOperationAsyncOperation class

Classe AsyncOperationManagerAsyncOperationManager class

Classe AttributeCollectionAttributeCollection class

Classe BackgroundWorkerBackgroundWorker class

Classe BaseNumberConverterBaseNumberConverter class

Classe BindingList<T>BindingList<T> class

Classe BooleanConverterBooleanConverter class

Classe ByteConverterByteConverter class

Classe CancelEventArgsCancelEventArgs class

Representante CancelEventHandlerCancelEventHandler delegate

Classe CharConverterCharConverter class

Classe CollectionChangeEventArgsCollectionChangeEventArgs class

Representante CollectionChangeEventHandlerCollectionChangeEventHandler delegate

Classe CollectionConverterCollectionConverter class

Classe ComponentCollectionComponentCollection class

Classe ComponentConverterComponentConverter class

Classe ComponentEditorComponentEditor class

Classe ComponentResourceManagerComponentResourceManager class

Classe ContainerContainer class

Classe ContainerFilterServiceContainerFilterService class

Classe CultureInfoConverterCultureInfoConverter class

Classe CustomTypeDescriptorCustomTypeDescriptor class

Classe DateTimeConverterDateTimeConverter class

Classe DecimalConverterDecimalConverter class

Classe ActiveDesignerEventArgsActiveDesignerEventArgs class

Representante ActiveDesignerEventHandlerActiveDesignerEventHandler delegate

Classe CheckoutExceptionCheckoutException class

Classe CommandIDCommandID class

Classe ComponentChangedEventArgsComponentChangedEventArgs class

Representante ComponentChangedEventHandlerComponentChangedEventHandler delegate

Classe ComponentChangingEventArgsComponentChangingEventArgs class

Representante ComponentChangingEventHandlerComponentChangingEventHandler delegate

Classe ComponentEventArgsComponentEventArgs class

Representante ComponentEventHandlerComponentEventHandler delegate

Classe ComponentRenameEventArgsComponentRenameEventArgs class

Representante ComponentRenameEventHandlerComponentRenameEventHandler delegate

Classe DesignerCollectionDesignerCollection class

Classe DesignerEventArgsDesignerEventArgs class

Representante DesignerEventHandlerDesignerEventHandler delegate

Classe DesignerOptionServiceDesignerOptionService class

Classe DesignerTransactionDesignerTransaction class

Classe DesignerTransactionCloseEventArgsDesignerTransactionCloseEventArgs class

Representante DesignerTransactionCloseEventHandlerDesignerTransactionCloseEventHandler delegate

Classe DesignerVerbDesignerVerb class

Classe DesignerVerbCollectionDesignerVerbCollection class

Classe DesigntimeLicenseContextDesigntimeLicenseContext class

Classe DesigntimeLicenseContextSerializerDesigntimeLicenseContextSerializer class

Classe MenuCommandMenuCommand class

Classe ComponentSerializationServiceComponentSerializationService class

Classe ContextStackContextStack class

Classe DesignerLoaderDesignerLoader class

Classe InstanceDescriptorInstanceDescriptor class

Classe MemberRelationshipServiceMemberRelationshipService class

Classe ResolveNameEventArgsResolveNameEventArgs class

Representante ResolveNameEventHandlerResolveNameEventHandler delegate

Classe SerializationStoreSerializationStore class

Classe ServiceContainerServiceContainer class

Representante ServiceCreatorCallbackServiceCreatorCallback delegate

Classe StandardCommandsStandardCommands class

Classe StandardToolWindowsStandardToolWindows class

Classe DoubleConverterDoubleConverter class

Classe DoWorkEventArgsDoWorkEventArgs class

Representante DoWorkEventHandlerDoWorkEventHandler delegate

Classe EnumConverterEnumConverter class

Classe EventDescriptorEventDescriptor class

Classe EventDescriptorCollectionEventDescriptorCollection class

Classe EventHandlerListEventHandlerList class

Classe ExpandableObjectConverterExpandableObjectConverter class

Classe HandledEventArgsHandledEventArgs class

Representante HandledEventHandlerHandledEventHandler delegate

Classe InstanceCreationEditorInstanceCreationEditor class

Classe Int16ConverterInt16Converter class

Classe Int32ConverterInt32Converter class

Classe Int64ConverterInt64Converter class

Classe InvalidAsynchronousStateExceptionInvalidAsynchronousStateException class

Classe InvalidEnumArgumentExceptionInvalidEnumArgumentException class

Método BeginInvokeBeginInvoke method

Classe LicenseLicense class

Classe LicenseContextLicenseContext class

Classe LicenseExceptionLicenseException class

Classe LicenseManagerLicenseManager class

Classe LicenseProviderLicenseProvider class

Classe LicFileLicenseProviderLicFileLicenseProvider class

Classe ListChangedEventArgsListChangedEventArgs class

Representante ListChangedEventHandlerListChangedEventHandler delegate

Classe ListSortDescriptionListSortDescription class

Classe ListSortDescriptionCollectionListSortDescriptionCollection class

Classe MaskedTextProviderMaskedTextProvider class

Classe MemberDescriptorMemberDescriptor class

Classe MultilineStringConverterMultilineStringConverter class

Classe NestedContainerNestedContainer class

Classe NullableConverterNullableConverter class

Classe ProgressChangedEventArgsProgressChangedEventArgs class

Representante ProgressChangedEventHandlerProgressChangedEventHandler delegate

Classe PropertyChangedEventArgsPropertyChangedEventArgs class

Representante PropertyChangedEventHandlerPropertyChangedEventHandler delegate

Classe PropertyDescriptorPropertyDescriptor class

Classe PropertyDescriptorCollectionPropertyDescriptorCollection class

Classe ReferenceConverterReferenceConverter class

Classe RefreshEventArgsRefreshEventArgs class

Representante RefreshEventHandlerRefreshEventHandler delegate

Classe RunWorkerCompletedEventArgsRunWorkerCompletedEventArgs class

Representante RunWorkerCompletedEventHandlerRunWorkerCompletedEventHandler delegate

Classe SByteConverterSByteConverter class

Classe SingleConverterSingleConverter class

Classe StringConverterStringConverter class

Classe SyntaxCheckSyntaxCheck class

Classe TimeSpanConverterTimeSpanConverter class

Classe TypeConverterTypeConverter class

Classe TypeDescriptionProviderTypeDescriptionProvider class

Classe TypeDescriptorTypeDescriptor class

Classe TypeListConverterTypeListConverter class

Classe UInt16ConverterUInt16Converter class

Classe UInt32ConverterUInt32Converter class

Classe UInt64ConverterUInt64Converter class

Classe WarningExceptionWarningException class

Classe Win32ExceptionWin32Exception class
System.Diagnostics Propriedade Debug.ListenersDebug.Listeners property

Propriedade Trace.ListenersTrace.Listeners property

Propriedade EventLog.SynchronizingObjectEventLog.SynchronizingObject property

Classe ConsoleTraceListenerConsoleTraceListener class

Classe DefaultTraceListenerDefaultTraceListener class

Classe DelimitedListTraceListenerDelimitedListTraceListener class

Classe EventLogTraceListenerEventLogTraceListener class

Classe PerformanceCounterPerformanceCounter class

Classe PerformanceCounterCategoryPerformanceCounterCategory class

Classe ProcessProcess class

Classe ProcessStartInfoProcessStartInfo class

Classe TextWriterTraceListenerTextWriterTraceListener class

Classe TraceListenerTraceListener class

Classe XmlWriterTraceListenerXmlWriterTraceListener class

Propriedade TraceSource.ListenersTraceSource.Listeners property
System.IO Método Stream.SynchronizedStream.Synchronized method

Método TextReader.SynchronizedTextReader.Synchronized method

Método TextWriter.SynchronizedTextWriter.Synchronized method
System.Reflection.Emit Classe ConstructorBuilderConstructorBuilder class

Classe EventBuilderEventBuilder class

Classe FieldBuilderFieldBuilder class

Classe MethodBuilderMethodBuilder class

Classe CustomAttributeBuilderCustomAttributeBuilder class

Classe MethodRentalMethodRental class

Classe ModuleBuilderModuleBuilder class

Classe PropertyBuilderPropertyBuilder class

Classe TypeBuilderTypeBuilder class

Classe UnmanagedMarshalUnmanagedMarshal class
System.Text Método Group.SynchronizedGroup.Synchronized method

Método Match.SynchronizedMatch.Synchronized method
System.Threading Classe AutoResetEventAutoResetEvent class

Classe EventWaitHandleEventWaitHandle class

Classe ManualResetEventManualResetEvent class

Classe MonitorMonitor class

Classe MutexMutex class

Classe ReaderWriterLockReaderWriterLock class

Classe SemaphoreSemaphore class

Método Thread.AllocateNamedDataSlotThread.AllocateNamedDataSlot method

Método Thread.BeginCriticalRegionThread.BeginCriticalRegion method

Método Thread.EndCriticalRegionThread.EndCriticalRegion method

Método Thread.FreeNamedDataSlotThread.FreeNamedDataSlot method

Método Thread.GetDataThread.GetData method

Método Thread.JoinThread.Join method

Método Thread.SetApartmentStateThread.SetApartmentState method

Método Thread.SetDataThread.SetData method

Método Thread.SpinWaitThread.SpinWait method

Método Thread.StartThread.Start method

Método Thread.TrySetApartmentStateThread.TrySetApartmentState method

Classe ThreadPoolThreadPool class

Classe TimerTimer class
System.Timers Classe TimerTimer class
System.Web.Configuration Classe MachineKeyValidationConverterMachineKeyValidationConverter class
System.Windows.Forms Propriedade AutoCompleteStringCollection.SyncRootAutoCompleteStringCollection.SyncRoot property

Conjuntos de permissões do SQL ServerSQL Server Permission Sets

O SQL Server permite aos usuários especificar os requisitos de confiabilidade do código implantado em um banco de dados.SQL Server allows users to specify the reliability requirements for code deployed into a database. Quando os assemblies são carregados no banco de dados, o autor do assembly pode especificar um dos três conjuntos de permissões para o assembly: SAFE, EXTERNAL-ACCESS ou 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.

Conjunto de permissõesPermission set SAFESAFE EXTERNAL-ACCESSEXTERNAL-ACCESS UNSAFEUNSAFE
Segurança de acesso do códigoCode access security Somente execuçãoExecute only Execução + acesso a recursos externosExecute + access to external resources IrrestritoUnrestricted
Restrições do modelo de programaçãoProgramming model restrictions SimYes SimYes Sem restriçõesNo restrictions
Requisito de verificabilidadeVerifiability requirement SimYes SimYes NãoNo
Capacidade de chamar código nativoAbility to call native code NãoNo NãoNo SimYes

SAFE é o modo mais confiável e seguro, com restrições associadas ao modelo de programação permitido.SAFE is the most reliable and secure mode with associated restrictions in terms of the allowed programming model. O código SAFE tem recursos de alta confiabilidade e segurança.SAFE code has high reliability and security features. Assemblies SAFE recebem permissão suficiente para executar, realizar cálculos e ter acesso ao banco de dados local.SAFE assemblies are given enough permission to run, perform computations, and have access to the local database. Assemblies SAFE precisam ser seguros do tipo verificável e não têm permissão para chamar código não gerenciado.SAFE assemblies need to be verifiably type safe and are not allowed to call unmanaged code.

EXTERNAL-ACCESS fornece uma opção de segurança intermediária, permitindo que o código acesse recursos externos ao banco de dados, mas ainda tenha a confiabilidade e a segurança de 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 é para código altamente confiável que pode ser criado somente por administradores de bancos de dados.UNSAFE is for highly trusted code that can only be created by database administrators. Esses códigos confiáveis não têm nenhuma restrição de acesso do código e podem chamar um código não gerenciado (nativo).This trusted code has no code access restrictions, and it can call unmanaged (native) code.

O SQL Server usa a camada da política de segurança de acesso do código em nível de host para configurar uma política de host que concede um dos três conjuntos de permissões, com base no conjunto de permissões armazenado nos catálogos do 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. Código gerenciado em execução dentro do banco de dados sempre obtém um desses conjuntos de permissão de acesso de código.Managed code running inside the database always gets one of these code access permission sets.

Restrições do Modelo de ProgramaçãoProgramming Model Restrictions

O modelo de programação de código gerenciado no SQL Server exige funções, procedimentos e tipos que não exigem que o uso do estado seja mantido em várias invocações nem exigem o compartilhamento do estado entre várias sessões do usuário.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. Além disso, conforme descrito anteriormente, a presença do estado compartilhado pode causar exceções críticas que afetam a escalabilidade e a confiabilidade do aplicativo.Further, as described earlier, the presence of shared state can cause critical exceptions that impact the scalability and the reliability of the application.

Com base nessas considerações, o SQL Server não permite o uso de variáveis estáticas e membros de dados estáticos.Given these considerations, SQL Server disallows the use of static variables and static data members. Para assemblies SAFE e EXTERNAL-ACCESS, o SQL Server examina os metadados do assembly em tempo CREATE ASSEMBLY e falha a criação desses assemblies se encontra o uso de variáveis e membros de dados estáticos.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.

Confira tambémSee also