Compartilhar via


CREATE ASSEMBLY (Transact-SQL)

Applies to:SQL ServerAzure SQL Managed Instance

Cria um módulo de aplicativo gerenciado que contém metadados de classe e código gerenciado como um objeto em uma instância do SQL Server. Ao fazer referência a esse módulo, funções CLR (Common Language Runtime), procedimentos armazenados, gatilhos, agregações definidas pelo usuário e tipos definidos pelo usuário podem ser criados no banco de dados.

Convenções de sintaxe de Transact-SQL

Syntax

CREATE ASSEMBLY assembly_name
[ AUTHORIZATION owner_name ]
FROM { <client_assembly_specifier> | <assembly_bits> [ , ...n ] }
[ WITH PERMISSION_SET = { SAFE | EXTERNAL_ACCESS | UNSAFE } ]
[ ; ]
<client_assembly_specifier> ::=
    '[ \\computer_name\ ] share_name\ [ path\ ] manifest_file_name'
    | '[ local_path\ ] manifest_file_name'

<assembly_bits> ::=
{ varbinary_literal | varbinary_expression }

Arguments

assembly_name

O nome do assembly. The name must be unique within the database and a valid identifier.

AUTHORIZATION owner_name

Especifica o nome de um usuário ou função como proprietário do assembly. owner_name must either be the name of a role of which the current user is a member, or the current user must have IMPERSONATE permission on owner_name. Se não estiver especificada, a propriedade será dada ao usuário atual.

<client_assembly_specifier>

Especifica o caminho local ou o local da rede onde o assembly que está sendo carregado está localizado e também o nome do arquivo de manifesto que corresponde ao assembly. <client_assembly_specifier> pode ser expresso como uma cadeia de caracteres fixa ou uma expressão que avalia uma cadeia de caracteres fixa com variáveis. CREATE ASSEMBLY não dá suporte ao carregamento de assemblies multimódulos. O SQL Server também procura assemblies dependentes desse assembly no mesmo lugar e os carrega com o mesmo proprietário do assembly do nível raiz. Se esses assemblies dependentes não forem encontrados e ainda não estiverem carregados no banco de dados atual, CREATE ASSEMBLY o falhará. Se os assemblies dependentes já estiverem carregados no banco de dados atual, o proprietário deles deve ser o mesmo proprietário do assembly recém-criado.

Important

O Banco de Dados SQL do Azure e a Instância Gerenciada de SQL do Azure não dão suporte à criação de um assembly de um arquivo.

<client_assembly_specifier> não pode ser especificado se o usuário conectado estiver sendo representado.

<assembly_bits>

A lista de valores binários que compõem o assembly e seus assemblies dependentes. O primeiro valor na lista é considerado o assembly do nível raiz. Os valores correspondentes aos assemblies dependentes podem ser fornecidos em qualquer ordem. Todos os valores que não correspondem às dependências do assembly raiz são ignorados.

Note

Essa opção não está disponível em um banco de dados independente.

varbinary_literal

A varbinary literal.

varbinary_expression

An expression of type varbinary.

PERMISSION_SET { SAFE | EXTERNAL_ACCESS | UNSAFE }

Especifica um conjunto de permissões de acesso ao código que são concedidas ao assembly quando acessado pelo SQL Server. Se não for especificado, SAFE é aplicado como padrão.

A PERMISSION_SET opção é afetada pela opção Configuração do servidor: clr strict security . Quando clr strict security está habilitada, todos os assemblies são tratados como UNSAFE.

Recomendamos usar SAFE. SAFE é o conjunto de permissões 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 o Registro.

EXTERNAL_ACCESS Permite que os assemblies acessem determinados recursos externos do sistema, como arquivos, redes, variáveis de ambiente e o Registro.

UNSAFE permite que os assemblies tenham acesso irrestrito a recursos, dentro e fora de uma instância do SQL Server. O código em execução de dentro de um UNSAFE assembly pode chamar código não gerenciado.

SAFE é a configuração de permissão recomendada para assemblies que executam tarefas de computação e gerenciamento de dados sem acessar recursos fora de uma instância do SQL Server.

Note

As EXTERNAL_ACCESS opções e UNSAFE não estão disponíveis em um banco de dados independente.

Recomendamos o uso EXTERNAL_ACCESS de assemblies que acessam recursos fora de uma instância do SQL Server. EXTERNAL_ACCESS Os assemblies incluem as proteções de confiabilidade e escalabilidade dos SAFE assemblies, mas, do ponto de vista da segurança, são semelhantes aos UNSAFE assemblies. O código em EXTERNAL_ACCESS assemblies é executado por padrão na conta de serviço do SQL Server e acessa recursos externos nessa conta, a menos que o código represente explicitamente o chamador. Portanto, a permissão para criar EXTERNAL_ACCESS assemblies deve ser concedida somente a logons confiáveis para executar código na conta de serviço do SQL Server. Para obter mais informações sobre representação, consulte a segurança de integração do CLR.

A especificação UNSAFE permite que o código no assembly tenha total liberdade para executar operações no espaço de processo do SQL Server que podem comprometer a robustez do SQL Server. UNSAFE os assemblies também podem subverter potencialmente o sistema de segurança do SQL Server ou do Common Language Runtime. UNSAFE As permissões devem ser concedidas somente a assemblies altamente confiáveis. Only members of the sysadmin fixed server role can create and alter UNSAFE assemblies.

For more information about assembly permission sets, see Design assemblies.

A segurança de acesso ao código não é mais suportada

O CLR usa o CAS (Segurança de Acesso do Código) no .NET Framework, para o qual não há mais suporte como um limite de segurança. Um assembly CLR criado com o PERMISSION_SET = SAFE pode conseguir acessar recursos externos do sistema, chamar um código não gerenciado e adquirir privilégios sysadmin. No SQL Server 2017 (14.x) e versões posteriores, a opção a opção de sp_configure, clr strict security aprimora a segurança dos assemblies CLR. A clr strict security está habilitada por padrão e trata assemblies SAFE e EXTERNAL_ACCESS como se eles fossem marcados como UNSAFE. A opção clr strict security pode ser desabilitada para compatibilidade com versões anteriores, mas não é recomendado.

Recomendamos que você assine todos os assemblies por um certificado ou uma chave assimétrica com um logon correspondente que tenha recebido a permissão UNSAFE ASSEMBLY no banco de dados master. Os administradores do SQL Server também podem adicionar assemblies a uma lista de assemblies, na qual o Mecanismo de Banco de Dados deve confiar. For more information, see sys.sp_add_trusted_assembly.

Remarks

CREATE ASSEMBLY carrega um assembly que foi compilado anteriormente como um arquivo .dll do código gerenciado para uso dentro de uma instância do SQL Server.

Quando habilitada, a opção PERMISSION_SET nas instruções CREATE ASSEMBLY e ALTER ASSEMBLY é ignorada em tempo de execução, mas as opções PERMISSION_SET são preservadas nos metadados. Ignorar a opção minimiza a quebra de instruções de código existentes.

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

Ao tentar acessar o assembly especificado no <client_assembly_specifier>, o SQL Server representa o contexto de segurança do logon atual do Windows. Se <client_assembly_specifier> especificar um local de rede (caminho UNC), a representação do logon atual não será transportada para o local de rede devido a limitações de delegação. Nesse caso, o acesso é feito usando o contexto de segurança da conta de serviço do SQL Server. Para obter mais informações, consulte Credenciais (Mecanismo de Banco de Dados).

Besides the root assembly specified by assembly_name, SQL Server tries to upload any assemblies that are referenced by the root assembly being uploaded. Se um assembly referenciado já tiver sido carregado no banco de dados devido a uma instrução anterior CREATE ASSEMBLY , esse assembly não será carregado, mas estará disponível para o assembly raiz. Se um assembly dependente não tiver sido carregado anteriormente, mas o SQL Server não conseguir localizar seu arquivo de manifesto no diretório de origem, CREATE ASSEMBLY o retornará um erro.

Se algum assembly dependente referenciado pelo assembly raiz ainda não estiver no banco de dados e for carregado implicitamente junto com o assembly raiz, ele terá o mesmo conjunto de permissões que o assembly de nível raiz. Se for necessário criar os assemblies dependentes usando um conjunto de permissões diferente daquele usado pelo assembly de nível raiz, ambos terão que ser carregados explicitamente antes do assembly do nível raiz com o conjunto de permissões apropriado.

Assembly Validation

O SQL Server verifica os binários de assembly carregados pela CREATE ASSEMBLY instrução para garantir as seguintes verificações:

  • O binário de assembly está bem formado com metadados e segmentos de código válidos, e os segmentos de código têm instruções do Microsoft Intermediate Language (MSIL) válidas.

  • O conjunto de assemblies do sistema ao qual ele faz referência é um dos seguintes assemblies com suporte no SQL Server: , , , Microsoft.VisualBasic.dllmscorlib.dllSystem.Data.dllSystem.dllSystem.Xml.dllMicrosoft.VisualC.dllCustomMarshallers.dllSystem.Security.dllSystem.Web.Services.dllSystem.Data.SqlXml.dllSystem.Core.dllSystem.Xml.Linq.dll Outros assemblies de sistema podem ser referenciados, mas eles devem ser registrados explicitamente no banco de dados.

  • Para assemblies criados usando conjuntos de permissões ou SAFEEXTERNAL ACCESS permissões:

    • O código do assembly deve ser do tipo seguro. A segurança do tipo é estabelecida pela execução do verificador do CLR no assembly.

    • O assembly não deve conter nenhum membro de dados estáticos em suas classes, a menos que estejam marcados como somente leitura.

    • As classes no assembly não podem conter métodos finalizadores.

    • As classes ou os métodos do assembly devem ser anotados somente com os atributos de código permitidos. Para obter mais informações, consulte Integração CLR: atributos personalizados para rotinas CLR.

Além das verificações anteriores que são executadas quando CREATE ASSEMBLY as execuções, há verificações extras que são executadas no tempo de execução do código no assembly:

  • Chamar determinadas APIs do .NET Framework que exigem uma permissão de acesso ao código específica poderá falhar se o conjunto de permissões do assembly não incluir essa permissão.

  • Para SAFE e EXTERNAL_ACCESS assemblies, qualquer tentativa de chamar APIs do .NET Framework anotadas com determinados HostProtectionAttributes falhará.

For more information, see Design assemblies.

Permissions

Requer a permissão CREATE ASSEMBLY.

Se PERMISSION_SET = EXTERNAL_ACCESS for especificado, requer EXTERNAL ACCESS ASSEMBLY permissão no servidor. Se PERMISSION_SET = UNSAFE for especificado, requer UNSAFE ASSEMBLY permissão no servidor.

O usuário deve ser o proprietário de todos os assemblies referenciados pelo assembly que será carregado se já houver assemblies no banco de dados. To upload an assembly by using a file path, the current user must be a Windows authenticated login or a member of the sysadmin fixed server role. O logon do Windows do usuário que executa CREATE ASSEMBLY deve ter permissão de leitura no compartilhamento e nos arquivos que estão sendo carregados na instrução.

Permissões com a segurança estrita do CLR

As seguintes permissões necessárias para criar um assembly CLR quando o CLR strict security está habilitado:

  • O usuário deve ter a permissão CREATE ASSEMBLY
  • Além disso, uma das seguintes condições também deve ser verdadeira:
    • O assembly é assinado com um certificado ou uma chave assimétrica que tem um logon correspondente à permissão UNSAFE ASSEMBLY no servidor. A assinatura do assembly é recomendada.
    • O banco de dados tem a propriedade TRUSTWORTHY definida como ON e o banco de dados pertence a um logon que tem a permissão UNSAFE ASSEMBLY no servidor. Essa opção não é recomendada.

For more information about assembly permission sets, see Design assemblies.

Examples

A. Criar um assembly de uma DLL

O exemplo a seguir pressupõe que os exemplos do Mecanismo de Banco de Dados do SQL Server estejam instalados no local padrão do computador local e que o HelloWorld.csproj aplicativo de exemplo seja compilado. Para obter mais informações, confira Exemplo de Olá, Mundo.

CREATE ASSEMBLY HelloWorld
FROM '<system_drive>:\Program Files\Microsoft SQL Server\100\Samples\HelloWorld\CS\HelloWorld\bin\debug\HelloWorld.dll'
WITH PERMISSION_SET = SAFE;

Important

O Banco de Dados SQL do Azure não dá suporte à criação de um assembly de um arquivo.

B. Criar uma montagem a partir de bits de montagem

Substitua os bits de exemplo (que não estão completos ou válidos) pelos bits de montagem.

CREATE ASSEMBLY HelloWorld
    FROM 0x4D5A900000000000
WITH PERMISSION_SET = SAFE;