Compartilhar via


Criando assemblies

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

  • Conjuntos de embalagem

  • Gerenciando a segurança do assembly

  • Restrições em assemblies

Empacotamento de assemblies

Um assembly pode conter funcionalidade para mais de uma rotina ou tipo do SQL Server 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 ocorre porque os métodos dessas classes são mais propensos a chamar uns aos outros do que os de tarefas menos relacionadas.

Ao empacotar o código no assembly, considere 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 no qual as dependências de dados persistentes dependem (como tipos e índices definidos pelo usuário usando funções definidas pelo usuário) do código que não tem essas dependências de dados persistentes. Para obter mais informações, consulte Implementando assemblies e ALTER ASSEMBLY (Transact-SQL).

  • Se uma parte do código gerenciado exigir uma permissão mais alta, é melhor separar esse código em um assembly separado do código que não exige permissão mais alta.

Gerenciando a segurança do 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 isso especificando um dos três conjuntos de permissões ao criar ou modificar um assembly: SAFE, EXTERNAL_ACCESS ou UNSAFE.

SEGURO

SAFE é o conjunto de permissões padrão e é o mais restritivo. O código executado por um assembly com permissões SAFE não pode acessar recursos externos do sistema, como arquivos, rede, variáveis de ambiente ou registro. O código SAFE pode acessar dados dos bancos de dados locais do 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 do SQL Server. Portanto, recomendamos SAFE como o conjunto de permissões do assembly.

EXTERNAL_ACCESS

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

Os assemblies SAFE e EXTERNAL_ACCESS podem conter apenas o código que é verificável como seguro de tipo. 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 que não pertencem ao código. Além disso, eles não podem executar operações que possam ter um efeito adverso na robustez do processo do SQL Server.

INSEGURO

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

Além disso, especificar UNSAFE permite que o código no assembly execute operações consideradas não seguras por tipo pelo verificador CLR. Essas operações podem acessar buffers de memória no espaço de processo do SQL Server de maneira não controlada. Assemblies UNSAFE também podem potencialmente subverter o sistema de segurança do SQL Server ou do common language runtime. As permissões UNSAFE devem ser concedidas somente 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

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

Atributos personalizados não permitidos

Não é possível anotar assemblies 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  

Além disso, assemblies SAFE e EXTERNAL_ACCESS não podem ser anotados 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 do .NET Framework com suporte

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

custommarshallers.dll  
Microsoft.visualbasic.dll  
Microsoft.visualc.dll  
mscorlib.dll  
system.data.dll  
System.Data.SqlXml.dll  
system.dll  
system.security.dll  
system.web.services.dll  
system.xml.dll  
System.Transactions  
System.Data.OracleClient  
System.Configuration  

Consulte Também

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