Projetando assemblies
Aplica-se: SQL Server
Este artigo descreve os seguintes fatores que você deve considerar ao projetar assemblies:
- Conjuntos de embalagem
- Gerenciando a segurança do assembly
- Restrições em assemblies
Conjuntos de pacotes
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 para essas classes são mais propensos a chamar uns aos outros do que os métodos de tarefas menos relacionadas.
Ao empacotar o código no assembly, considere:
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, é melhor separar o código do qual dependem as dependências de dados persistentes (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 permissão mais alta, é melhor separar esse código em um assembly separado do código que não requer permissão mais alta.
Gerenciar 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
.
Permissão SAFE
SAFE
é o conjunto de permissões padrão e é o mais restritivo. O código executado por um assembly com SAFE
permissões não pode acessar recursos externos do sistema, como arquivos, rede, variáveis de ambiente ou registro. SAFE
O código 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 permissão
EXTERNAL_ACCESS
permite que 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 EXTERNAL ACCESS
permissões podem criar EXTERNAL_ACCESS
assemblies.
SAFE e EXTERNAL_ACCESS
assemblies podem conter apenas código que é verificável com segurança 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.
Permissão UNSAFE
UNSAFE
fornece aos assemblies acesso irrestrito aos recursos, dentro e fora do SQL Server. O código que está sendo executado de dentro de um UNSAFE
assembly pode chamar código não gerenciado.
Além disso, a especificação UNSAFE
permite que o código no assembly execute operações consideradas inseguras 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. UNSAFE
os assemblies também podem subverter potencialmente o sistema de segurança do SQL Server ou do Common Language Runtime. 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 UNSAFE
assemblies.
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 SAFE e EXTERNAL_ACCESS
assemblies.
Atributos personalizados não permitidos
Os 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
Além disso, SAFE
EXTERNAL_ACCESS
os assemblies 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 assemblies não permitidos HostProtectionAttributes
não pode ser chamada de SAFE
e EXTERNAL_ACCESS
assemblies.
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
o . Os assemblies do .NET Framework a seguir já estão carregados no SQL Server e, portanto, podem ser referenciados por assemblies personalizados sem a necessidade de usar CREATE ASSEMBLY
o .
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