Assemblies – criação

Aplica-se a:SQL Server

Este tópico descreve os seguintes fatores que você deve considerar ao projetar assemblies:

  • Empacotamento de assemblies

  • Gerenciando a segurança do assembly

  • Restrições em assemblies

Empacotando assemblies

Um assembly pode conter funcionalidade para mais de um SQL Server rotina ou tipo em suas classes e métodos. A maior parte do tempo, faz sentido empacotar a funcionalidade de rotinas que executam funções relacionadas dentro do mesmo assembly, especialmente se essas rotinas compartilharem classes cujos métodos chamam um ao outro. Por exemplo, classes que executam tarefas de gerenciamento de entrada de dados para gatilhos CLR (Common Language Runtime) e procedimentos armazenados CLR podem ser empacotados no mesmo assembly. Isso porque os métodos para essas classes têm maior probabilidade de chamar um ao outro do que aqueles de tarefas menos relacionadas.

Quando você estiver empacotando código em um assembly, você deverá considerar o seguinte:

  • Tipos de dados CLR definidos pelo usuário e índices que dependem de funções CLR definidas pelo usuário podem fazer com que dados persistentes fiquem no banco de dados que dependem do assembly. Modificar o código de um assembly é frequentemente mais complexo quando há dados persistentes que dependem do assembly no banco de dados. Portanto, geralmente é melhor separar o código onde haja dependências de dados persistentes (como tipos definidos pelo usuário e índices com funções definidas pelo usuário) do código que não tenha tal dependência de dados persistentes. Para obter mais informações, consulte Implementando assemblies e ALTER ASSEMBLY (Transact-SQL).

  • Se uma parte do código gerenciado requerer permissão mais alta, será melhor separar aquele código em um assembly separado do código que não requer tal permissão.

Gerenciando segurança de assembly

Você pode controlar quanto um assembly pode acessar recursos protegidos por Código de .NET Access Security quando executar código gerenciado. Você faz isto especificando um de três conjuntos de permissão quando você cria ou modifica um assembly: SAFE, EXTERNAL_ACCESS ou UNSAFE.

SAFE

SAFE é o conjunto de permissões padrão e é o mais restritivo. Código executado por um assembly com permissões SAFE não pode acessar recursos do sistema externo, como arquivos, rede, variáveis de ambiente ou Registro. O código SAFE pode acessar dados dos bancos de dados locais SQL Server ou executar cálculos e lógica de negócios que não envolvem o acesso a recursos fora dos bancos de dados locais.

A maioria dos assemblies executa tarefas de computação e gerenciamento de dados sem precisar acessar recursos fora SQL Server. Portanto, nós recomendamos SAFE como conjunto de permissões de assembly.

EXTERNAL_ACCESS

EXTERNAL_ACCESS permite que assemblies acessem certos recursos do sistema externo como arquivos, redes, serviços da Web, variáveis ambientais e Registro. Somente logons SQL Server com permissões EXTERNAL ACCESS podem criar assemblies EXTERNAL_ACCESS.

Assemblies SAFE e EXTERNAL_ACCESS só podem conter código do tipo seguro verificável. Isso significa que esses assemblies só podem acessar classes por pontos bem definido de entrada que sejam válidos para a definição de tipo. Portanto, eles não podem acessar arbitrariamente buffers de memória não pertencentes ao código. Além disso, eles não podem executar operações que possam ter um efeito adverso na robustez do processo de SQL Server.

UNSAFE

UNSAFE fornece aos assemblies acesso irrestrito aos recursos, dentro e fora SQL Server. Código executado em um assembly UNSAFE pode chamar código não gerenciado.

Além disso, especificando UNSAFE permite que o código no assembly execute operações consideradas como tipo inseguro pelo verificador CLR. Essas operações podem potencialmente acessar buffers de memória no SQL Server processar o espaço de maneira descontrolada. Assemblies UNSAFE também podem potencialmente subverter o sistema de segurança do SQL Server ou do CLR. Somente permissões UNSAFE devem ser concedidas a assemblies altamente confiáveis por desenvolvedores ou administradores experientes. Somente membros da função de servidor fixa sysadmin podem criar assemblies UNSAFE.

Restrições em assemblies

SQL Server coloca determinadas restrições ao código gerenciado em assemblies para garantir que eles possam ser executados de maneira confiável e escalonável. Isso significa que não são permitidas certas operações que podem comprometer a robustez do servidor em assemblies SAFE e EXTERNAL_ACCESS.

Atributos personalizados não permitidos

Assemblies não podem ser anotados com os seguintes atributos personalizados:

System.ContextStaticAttribute  
System.MTAThreadAttribute  
System.Runtime.CompilerServices.MethodImplAttribute  
System.Runtime.CompilerServices.CompilationRelaxationsAttribute  
System.Runtime.Remoting.Contexts.ContextAttribute  
System.Runtime.Remoting.Contexts.SynchronizationAttribute  
System.Runtime.InteropServices.DllImportAttribute   
System.Security.Permissions.CodeAccessSecurityAttribute  
System.STAThreadAttribute  
System.ThreadStaticAttribute  

Adicionalmente, não podem ser anotados assemblies SAFE e EXTERNAL_ACCESS com os seguintes atributos personalizados:

System.Security.SuppressUnmanagedCodeSecurityAttribute  
System.Security.UnverifiableCodeAttribute  

APIs não permitidas do .NET Framework

Qualquer API do Microsoft .NET Framework anotada com um dos hostProtectionAttributes não permitidos não pode ser chamada de assemblies SAFE e EXTERNAL_ACCESS.

eSelfAffectingProcessMgmt  
eSelfAffectingThreading  
eSynchronization  
eSharedState   
eExternalProcessMgmt  
eExternalThreading  
eSecurityInfrastructure  
eMayLeakOnAbort  
eUI  

Assemblies .NET Framework suportados

Qualquer assembly referenciado pelo assembly personalizado deve ser carregado em SQL Server usando CREATE ASSEMBLY. Os assemblies de .NET Framework a seguir já são carregados em SQL Server e, portanto, podem ser referenciados por assemblies personalizados sem precisar usar CREATE ASSEMBLY.

CustomMarshalers.dll  
Microsoft.VisualBasic.dll  
Microsoft.VisualC.dll  
mscorlib.dll  
System.dll  
System.Configuration.dll  
System.Core.dll  
System.Data.dll  
System.Data.OracleClient.dll  
System.Data.SqlXml.dll  
System.Deployment.dll  
System.Security.dll  
System.Transactions.dll  
System.Web.Services.dll  
system.Xml.dll  
System.Xml.Linq.dll  

Consulte Também

Assemblies (Mecanismo de Banco de Dados)
Segurança da integração CLR