Partilhar via


CRIAR MONTAGEM (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 este 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.

Transact-SQL convenções de sintaxe

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 for especificado, a propriedade será dada ao usuário atual.

<client_assembly_specifier>

Especifica o caminho local ou o local de 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 expressa como uma string fixa ou uma expressão avaliando para uma string fixa, com variáveis. CREATE ASSEMBLY não suporta o carregamento de montagens multimódulo. O SQL Server também procura todos os assemblies dependentes desse assembly no mesmo local e também os carrega com o mesmo proprietário do assembly de nível raiz. Se esses assemblies dependentes não forem encontrados e ainda não estiverem carregados no banco de dados atual, CREATE ASSEMBLY falhará. Se os assemblies dependentes já estiverem carregados no banco de dados atual, o proprietário desses assemblies deverá ser o mesmo que o proprietário do assembly recém-criado.

Important

Banco de Dados SQL do Azure & Instância Gerenciada SQL do Azure não dão suporte à criação de um assembly a partir 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 de nível raiz. Os valores correspondentes às montagens 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 contido.

varbinary_literal

A varbinary literal.

varbinary_expression

An expression of type varbinary.

PERMISSION_SET { SEGURO | EXTERNAL_ACCESS | INSEGURO }

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

A PERMISSION_SET opção é afetada pela configuração do servidor: opção de segurança estrita clr . Quando clr strict security habilitado, todos os assemblies são tratados como UNSAFE.

Recomendamos a utilização do SAFE. SAFE é o conjunto de permissões mais restritivo. O código executado por um assembly com permissões SAFE não pode acessar recursos externos do sistema, como arquivos, a rede, variáveis de ambiente ou o registro.

EXTERNAL_ACCESS Permite que assemblies acessem determinados recursos externos do sistema, como arquivos, redes, variáveis ambientais e o registro.

UNSAFE permite o acesso irrestrito de assemblies a recursos, dentro e fora de uma instância do SQL Server. O código executado a partir 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 contido.

Recomendamos o uso EXTERNAL_ACCESS para 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 assemblies, mas, do ponto de SAFE 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 Segurança de integração 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 assemblies também podem potencialmente subverter o sistema de segurança do SQL Server ou do Common Language Runtime. UNSAFE As permissões devem ser concedidas apenas 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 (Code Access Security) no .NET Framework, que não é mais suportado como um limite de segurança. Um assembly CLR criado com PERMISSION_SET = SAFE pode aceder a recursos externos do sistema, chamar código não supervisionado e adquirir privilégios de administrador do sistema. No SQL Server 2017 (14.x) e versões posteriores, a opção sp_configure, segurança estrita do CLR, aumenta a segurança dos assemblies CLR. clr strict security está ativado por padrão e trata as assemblagens SAFE e EXTERNAL_ACCESS como se estivessem marcadas UNSAFE. A opção clr strict security pode ser desativada para compatibilidade com versões anteriores, mas não é recomendada.

Recomendamos que você assine todos os assemblies por um certificado ou chave assimétrica, com um logon correspondente que tenha recebido permissão UNSAFE ASSEMBLY no banco de dados master. Os administradores do SQL Server também podem adicionar assemblies à lista de assemblies, nos quais o motor de base 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 de .dll do código gerenciado para uso dentro de uma instância do SQL Server.

Quando a opção PERMISSION_SET nas instruções CREATE ASSEMBLY e ALTER ASSEMBLY está ativada, ela é 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á transferida 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á estiver 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 puder localizar seu arquivo de manifesto no diretório de origem, CREATE ASSEMBLY retornará um erro.

Se quaisquer assemblies dependentes referenciados pelo assembly raiz ainda não estiverem no banco de dados e forem carregados implicitamente junto com o assembly raiz, eles terão o mesmo conjunto de permissões que o assembly de nível raiz. Se os assemblies dependentes devem ser criados usando um conjunto de permissões diferente do assembly de nível raiz, eles devem ser carregados explicitamente antes do assembly de 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 é bem formado com metadados válidos e segmentos de código, e os segmentos de código têm instruções válidas de linguagem Microsoft Intermediate (MSIL).

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

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

    • O código de montagem deve ser seguro para tipos. A segurança de tipo é estabelecida executando o verificador Common Language Runtime no assembly.

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

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

    • As classes ou métodos do assembly devem ser anotados somente com 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 executadas, há verificações extras que são executadas no momento 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 pode 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 que são anotadas com determinados HostProtectionAttributes falha.

For more information, see Design assemblies.

Permissions

Requer 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ão carregados se os assemblies já existirem 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 login do Windows do usuário que executa deve ter permissão de leitura no compartilhamento e nos arquivos que estão sendo carregados CREATE ASSEMBLY na instrução.

Permissões com segurança estrita CLR

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

  • O usuário deve ter a CREATE ASSEMBLY permissão
  • E uma das seguintes condições também deve ser verdadeira:
    • A montagem é assinada com um certificado ou chave assimétrica que tem um login correspondente com a permissão UNSAFE ASSEMBLY no servidor. Recomenda-se assinar o assembly.
    • O banco de dados tem a TRUSTWORTHY propriedade definida como ON, e o banco de dados é de propriedade de um login que possui a permissão UNSAFE ASSEMBLY no servidor. Esta opção não é recomendada.

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

Examples

A. Criar um assembly a partir 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, consulte Hello World Sample.

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 a partir de um arquivo.

B. Criar um assembly a partir de bits de assembly

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

CREATE ASSEMBLY HelloWorld
    FROM 0x4D5A900000000000
WITH PERMISSION_SET = SAFE;