Compartilhar via


Criando um assembly

Os objetos de banco de dados gerenciado, como os procedimentos armazenados ou gatilhos, são compilados e implantados em unidades chamadas de assembly. Os assemblies DLL gerenciados precisam ser registrados no MicrosoftSQL Server para que a funcionalidade do assembly possa ser usada. Para registrar um assembly em um banco de dados do SQL Server, use a instrução CREATE ASSEMBLY. Este tópico trata sobre como registrar um assembly em um banco de dados usando a instrução CREATE ASSEMBLY e como especificar as configurações de segurança do assembly.

A instrução CREATE ASSEMBLY

A instrução CREATE ASSEMBLY é usada para criar um assembly em um banco de dados. A seguir está um exemplo:

CREATE ASSEMBLY SQLCLRTest
FROM 'C:\MyDBApp\SQLCLRTest.dll'

A cláusula FROM especifica o nome do caminho do assembly a ser criado. Esse caminho pode ser um caminho UNC (convenção de nomenclatura universal) ou um caminho físico do arquivo que é local no computador.

O SQL Server não permite o registro de versões diferentes de um assembly com nome, cultura e chave pública iguais.

É possível criar assemblies que referenciem outros. Quando um assembly é criado no SQL Server, o SQL Server também cria os assemblies referenciados pelo assembly do nível raiz, se eles ainda não foram criados no banco de dados.

Os usuários de banco de dados ou as funções de usuário obtêm permissões para criar, e assim ter propriedade sobre, os assemblies em um banco de dados. Para criar assemblies, a função ou o usuário de banco de dados deve ter a permissão CREATE ASSEMBLY.

Um assembly só poderá ter êxito ao referenciar outros assemblies se:

  • O assembly chamado ou referenciado tem como proprietário o mesmo usuário ou função.

  • O assembly chamado ou referenciado foi criado no mesmo banco de dados.

Especificando a segurança ao criar assemblies

Ao criar um assembly em um banco de dados do SQL Server, você pode especificar um dos três diferentes níveis de segurança em que o código pode ser executado: SAFE, EXTERNAL_ACCESS ou UNSAFE. Quando a instrução CREATE ASSEMBLY é executada, determinadas verificações são realizadas no assembly do código que podem causar falha no assembly ao se registrar no servidor.

SAFE é o conjunto de permissões padrão e funciona para a maioria dos cenários. Para especificar um determinado nível de segurança, modifique a sintaxe da instrução CREATE ASSEMBLY da seguinte maneira:

CREATE ASSEMBLY SQLCLRTest
FROM 'C:\MyDBApp\SQLCLRTest.dll'
WITH PERMISSION_SET = SAFE

Também é possível criar um assembly com o conjunto de permissões SAFE simplesmente omitindo a terceira linha de código acima:

CREATE ASSEMBLY SQLCLRTest
FROM 'C:\MyDBApp\SQLCLRTest.dll'

Quando o código de um assembly é executado no conjunto de permissões SAFE, ele só pode fazer cálculos e acessar dados no servidor através do provedor gerenciado em processo.

Criando assemblies EXTERNAL_ACCESS e UNSAFE

O EXTERNAL_ACCESS aborda cenários nos quais o código precisa acessar recursos fora do servidor, como arquivos, rede, o Registro e variáveis de ambiente. Sempre que o servidor acessa um recurso externo, ele representa o contexto de segurança do usuário que chama o código gerenciado.

A permissão de código UNSAFE é usada nas situações em que um assembly não é seguro de modo verificável ou exige acesso adicional a recursos restritos, como a API do Win32 da Microsoft.

Para criar um assembly EXTERNAL_ACCESS ou UNSAFE no SQL Server, é necessário atender a uma das duas condições a seguir:

  1. O assembly é assinado com nome forte ou com Authenticode usando um certificado. Esse nome forte (ou certificado) é criado no SQL Server como uma chave assimétrica (ou certificado) e tem um logon correspondente com a permissão EXTERNAL ACCESS ASSEMBLY (para assemblies de acesso externo) ou a permissão UNSAFE ASSEMBLY (para assemblies não seguros).

  2. O DBO (proprietário de banco de dados) tem a permissão EXTERNAL ACCESS ASSEMBLY (para assemblies EXTERNAL ACCESS) ou UNSAFE ASSEMBLY (para assemblies UNSAFE) e o banco de dados tem Propriedade de banco de dados TRUSTWORTHY definido como ON.

As duas condições listadas acima também são verificadas na hora do carregamento do assembly (que inclui a execução). Pelo menos um das condições precisa ser cumprida para carregar o assembly.

Recomendamos que o Propriedade de banco de dados TRUSTWORTHY em um banco de dados não seja definido como ON apenas para executar código CLR (common language runtime) no processo do servidor. Em vez disso, recomendamos que seja criada uma chave assimétrica do arquivo de assembly no banco de dados mestre. É necessário criar um logon mapeado para essa chave assimétrica o qual precisa receber a concessão de uma permissão EXTERNAL ACCESS ASSEMBLY ou UNSAFE ASSEMBLY.

As instruções Transact-SQL a seguir executam as etapas necessárias para criar uma chave assimétrica e conceder a permissão EXTERNAL_ACCESS ao logon. Você deve executar as instruções Transact-SQL a seguir antes de executar a instrução CREATE ASSEMBLY.

USE master 
GO  
 
CREATE ASYMMETRIC KEY SQLCLRTestKey FROM EXECUTABLE FILE = 'C:\MyDBApp\SQLCLRTest.dll'   
CREATE LOGIN SQLCLRTestLogin FROM ASYMMETRIC KEY SQLCLRTestKey   
GRANT EXTERNAL ACCESS ASSEMBLY TO SQLCLRTestLogin 
GO 
ObservaçãoObservação

Você deve criar um logon novo para associar com a chave assimétrica. Esse logon é usado somente para conceder permissões; não precisa estar associado a um usuário ou usado dentro do aplicativo.

Para criar um assembly EXTERNAL ACCESS, o criador precisa ter a permissão EXTERNAL ACCESS. Isso é especificado ao criar o assembly:

CREATE ASSEMBLY SQLCLRTest
FROM 'C:\MyDBApp\SQLCLRTest.dll'
WITH PERMISSION_SET = EXTERNAL_ACCESS

As instruções Transact-SQL a seguir executam as etapas necessárias para criar uma chave assimétrica e conceder a permissão UNSAFE ao logon. Você deve executar as instruções Transact-SQL a seguir antes de executar a instrução CREATE ASSEMBLY.

USE master 
GO  
 
CREATE ASYMMETRIC KEY SQLCLRTestKey FROM EXECUTABLE FILE = 'C:\MyDBApp\SQLCLRTest.dll'   
CREATE LOGIN SQLCLRTestLogin FROM ASYMMETRIC KEY SQLCLRTestKey   
GRANT UNSAFE ASSEMBLY TO SQLCLRTestLogin 
GO

Para especificar que um assembly é carregado com a permissão UNSAFE, especifique o conjunto de permissões UNSAFE ao carregar o assembly no servidor:

CREATE ASSEMBLY SQLCLRTest
FROM 'C:\MyDBApp\SQLCLRTest.dll'
WITH PERMISSION_SET = UNSAFE

Para obter mais detalhes sobre as permissões para cada uma das configurações, consulte Segurança da integração CLR.

Histórico de alterações

Conteúdo atualizado

Adicionada uma observação sobre como usar o logon criado para a chave assimétrica.