CREATE ASSEMBLY (Transact-SQL)CREATE ASSEMBLY (Transact-SQL)

APLICA-SE A: simSQL Server (a partir do 2008) simBanco de Dados SQL do Azure (somente Instância Gerenciada) nãoSQL Data Warehouse do Azure nãoParallel Data Warehouse APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database (Managed Instance only) noAzure SQL Data Warehouse noParallel Data Warehouse

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 ServerSQL Server.Creates a managed application module that contains class metadata and managed code as an object in an instance of SQL ServerSQL 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.By referencing this module, common language runtime (CLR) functions, stored procedures, triggers, user-defined aggregates, and user-defined types can be created in the database.

Aviso

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.CLR uses Code Access Security (CAS) in the .NET Framework, which is no longer supported as a security boundary. 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.A CLR assembly created with PERMISSION_SET = SAFE may be able to access external system resources, call unmanaged code, and acquire sysadmin privileges. A partir do SQL Server 2017 (14.x)SQL Server 2017 (14.x), uma opção sp_configure chamada clr strict security é introduzida, a fim de aumentar a segurança de assemblies CLR.Beginning with SQL Server 2017 (14.x)SQL Server 2017 (14.x), an sp_configure option called clr strict security is introduced to enhance the security of CLR assemblies. A clr strict security está habilitada por padrão e trata assemblies SAFE e EXTERNAL_ACCESS como se eles fossem marcados como UNSAFE.clr strict security is enabled by default, and treats SAFE and EXTERNAL_ACCESS assemblies as if they were marked UNSAFE. A opção clr strict security pode ser desabilitada para compatibilidade com versões anteriores, mas isso não é recomendado.The clr strict security option can be disabled for backward compatibility, but this is not recommended. A Microsoft recomenda que todos os assemblies sejam assinados por um certificado ou uma chave assimétrica com um logon correspondente que recebeu a permissão UNSAFE ASSEMBLY no banco de dados mestre.Microsoft recommends that all assemblies be signed by a certificate or asymmetric key with a corresponding login that has been granted UNSAFE ASSEMBLY permission in the master database. Para obter mais informações, consulte Segurança estrita do CLR.For more information, see CLR strict security.

Ícone de link do tópico Convenções de sintaxe de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxeSyntax

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 }  

ArgumentosArguments

assembly_nameassembly_name
É o nome do assembly.Is the name of the assembly. O nome precisa ser exclusivo no banco de dados e um identificador válido.The name must be unique within the database and a valid identifier.

AUTHORIZATION owner_nameAUTHORIZATION owner_name
Especifica o nome de um usuário ou função como proprietário do assembly.Specifies the name of a user or role as owner of the assembly. owner_name precisa ser o nome de uma função da qual o usuário atual é membro ou o usuário atual precisa ter a permissão IMPERSONATE no owner_name.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.If not specified, ownership is given to the current user.

<client_assembly_specifier><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.Specifies the local path or network location where the assembly that is being uploaded is located, and also the manifest file name that corresponds to the assembly. <client_assembly_specifier> pode ser expresso como uma cadeia de caracteres fixa ou uma expressão que é avaliada para uma cadeia de caracteres fixa, com variáveis.<client_assembly_specifier> can be expressed as a fixed string or an expression evaluating to a fixed string, with variables. CREATE ASSEMBLY não dá suporte ao carregamento de assemblies de vários módulos.CREATE ASSEMBLY does not support loading multimodule assemblies. O SQL ServerSQL 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.SQL ServerSQL Server also looks for any dependent assemblies of this assembly in the same location and also uploads them with the same owner as the root level assembly. Se esses assemblies dependentes não forem encontrados e eles já não estiverem carregados no banco de dados atual, CREATE ASSEMBLY falhará.If these dependent assemblies are not found and they are not already loaded in the current database, CREATE ASSEMBLY fails. 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.If the dependent assemblies are already loaded in the current database, the owner of those assemblies must be the same as the owner of the newly created assembly.

Importante

O Banco de Dados SQL do Azure não é compatível com a criação de um assembly a partir de um arquivo.Azure SQL Database does not support creating an assembly from a file.

<client_assembly_specifier> não poderá ser especificado se o usuário conectado estiver sendo representado.<client_assembly_specifier> cannot be specified if the logged in user is being impersonated.

<assembly_bits><assembly_bits>
É a lista de valores binários que compõe o assembly e seus assemblies dependentes.Is the list of binary values that make up the assembly and its dependent assemblies. O primeiro valor na lista é considerado o assembly do nível raiz.The first value in the list is considered the root-level assembly. Os valores correspondentes aos assemblies dependentes podem ser fornecidos em qualquer ordem.The values corresponding to the dependent assemblies can be supplied in any order. Qualquer valor que não corresponda a dependências do assembly raiz será ignorado.Any values that do not correspond to dependencies of the root assembly are ignored.

Observação

Essa opção não está disponível em um banco de dados independente.This option is not available in a contained database.

varbinary_literalvarbinary_literal
É um literal varbinary.Is a varbinary literal.

varbinary_expressionvarbinary_expression
É uma expressão do tipo varbinary.Is an expression of type varbinary.

PERMISSION_SET { SAFE | EXTERNAL_ACCESS | UNSAFE }PERMISSION_SET { SAFE | EXTERNAL_ACCESS | UNSAFE }

Importante

A opção PERMISSION_SET é afetada pela opção clr strict security, descrita no aviso de abertura.The PERMISSION_SET option is affected by the clr strict security option, described in the opening warning. Quando clr strict security está habilitada, todos os assemblies são tratados como UNSAFE.When clr strict security is enabled, all assemblies are treated as UNSAFE.

Especifica um conjunto de permissões de acesso de código que são concedidas ao assembly quando ele é acessado pelo SQL ServerSQL Server.Specifies a set of code access permissions that are granted to the assembly when it is accessed by SQL ServerSQL Server. Se não especificado, SAFE será aplicado por padrão.If not specified, SAFE is applied as the default.

É recomendável o uso de SAFE.We recommend using SAFE. SAFE é o conjunto de permissões mais restritivo.SAFE is the most restrictive permission set. O código executado por um assembly com as permissões SAFE não pode acessar recursos externos do sistema, como arquivos, a rede, variáveis de ambiente ou o Registro.Code executed by an assembly with SAFE permissions cannot access external system resources such as files, the network, environment variables, or the registry.

EXTERNAL_ACCESS permite que os assemblies acessem certos recursos externos do sistema, como arquivos, redes, variáveis de ambiente e o Registro.EXTERNAL_ACCESS enables assemblies to access certain external system resources such as files, networks, environmental variables, and the registry.

Observação

Essa opção não está disponível em um banco de dados independente.This option is not available in a contained database.

UNSAFE concede aos assemblies acesso irrestrito aos recursos, internos ou externos, de uma instância do SQL ServerSQL Server.UNSAFE enables assemblies unrestricted access to resources, both within and outside an instance of SQL ServerSQL Server. O código executado a partir de um assembly UNSAFE pode chamar um código não gerenciado.Code running from within an UNSAFE assembly can call unmanaged code.

Observação

Essa opção não está disponível em um banco de dados independente.This option is not available in a contained database.

Importante

SAFE é a configuração de permissão recomendada para assemblies que executam tarefas de computação e de gerenciamento de dados sem acessar recursos externos de uma instância do SQL ServerSQL Server.SAFE is the recommended permission setting for assemblies that perform computation and data management tasks without accessing resources outside an instance of SQL ServerSQL Server.

É recomendável o uso de EXTERNAL_ACCESS para assembly que acessam recursos fora de uma instância do SQL ServerSQL Server.We recommend using EXTERNAL_ACCESS for assemblies that access resources outside of an instance of SQL ServerSQL Server. Assemblies EXTERNAL_ACCESS possuem proteções de confiabilidade e escalabilidade dos assemblies SAFE, mas com uma perspectiva de segurança similar a de assemblies UNSAFE.EXTERNAL_ACCESS assemblies include the reliability and scalability protections of SAFE assemblies, but from a security perspective are similar to UNSAFE assemblies. Isso porque o código de assemblies EXTERNAL_ACCESS é executado, por padrão, em uma conta de serviço do SQL ServerSQL Server e acessa recursos externos por essa conta, exceto se o código representar explicitamente o chamador.This is because code in EXTERNAL_ACCESS assemblies runs by default under the SQL ServerSQL Server service account and accesses external resources under that account, unless the code explicitly impersonates the caller. Portanto, a permissão para criar assemblies EXTERNAL_ACCESS ser concedida apenas para logons confiáveis para executar o código pela conta de serviço do SQL ServerSQL Server.Therefore, permission to create EXTERNAL_ACCESS assemblies should be granted only to logins that are trusted to run code under the SQL ServerSQL Server service account. Para obter mais informações sobre representação, confira Segurança da integração do CLR (Common Language Runtime).For more information about impersonation, see CLR Integration Security.

A especificação de UNSAFE proporciona ao código do assembly liberdade total para executar operações no espaço de processo do SQL ServerSQL Server, o que pode comprometer a robustez do SQL ServerSQL Server.Specifying UNSAFE enables the code in the assembly complete freedom to perform operations in the SQL ServerSQL Server process space that can potentially compromise the robustness of SQL ServerSQL Server. Assemblies UNSAFE também podem potencialmente subverter o sistema de segurança do SQL ServerSQL Server ou do CLR.UNSAFE assemblies can also potentially subvert the security system of either SQL ServerSQL Server or the common language runtime. Permissões UNSAFE devem ser concedidas exclusivamente para assemblies altamente confiáveis.UNSAFE permissions should be granted only to highly trusted assemblies. Somente membros da função de servidor fixa sysadmin podem criar e alterar assemblies UNSAFE.Only members of the sysadmin fixed server role can create and alter UNSAFE assemblies.

Para obter mais informações sobre conjuntos de permissões de assembly, confira Criando assemblies.For more information about assembly permission sets, see Designing Assemblies.

RemarksRemarks

CREATE ASSEMBLY carrega um assembly previamente compilado como um arquivo .dll a partir do código gerenciado para uso dentro de uma instância do SQL Server.CREATE ASSEMBLY uploads an assembly that was previously compiled as a .dll file from managed code for use inside an instance of 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.When enabled, the PERMISSION_SET option in the CREATE ASSEMBLY and ALTER ASSEMBLY statements is ignored at run-time, but the PERMISSION_SET options are preserved in metadata. Ignorar a opção minimiza a interrupção de instruções de código existentes.Ignoring the option, minimizes breaking existing code statements.

O SQL ServerSQL Server não permite o registro de versões diferentes de um assembly com nome, cultura e chave pública iguais.SQL ServerSQL Server does not allow registering different versions of an assembly with the same name, culture and public key.

Ao tentar acessar o assembly especificado em <client_assembly_specifier>, o SQL ServerSQL Server representa o contexto de segurança do logon atual do Windows.When attempting to access the assembly specified in <client_assembly_specifier>, SQL ServerSQL Server impersonates the security context of the current Windows login. Se <client_assembly_specifier> especificar um local de rede (caminho UNC), a representação do logon atual não será repassada ao local de rede devido a limitações de delegação.If <client_assembly_specifier> specifies a network location (UNC path), the impersonation of the current login is not carried forward to the network location because of delegation limitations. Nesse caso, o acesso é feito usando o contexto de segurança da conta de serviço do SQL ServerSQL Server.In this case, access is made using the security context of the SQL ServerSQL Server service account. Para obter mais informações, consulte Credenciais (Mecanismo de Banco de Dados).For more information, see Credentials (Database Engine).

Além do assembly raiz especificado por assembly_name, o SQL ServerSQL Server tenta carregar todos os assemblies que são referenciados pelo assembly raiz que está sendo carregado.Besides the root assembly specified by assembly_name, SQL ServerSQL Server tries to upload any assemblies that are referenced by the root assembly being uploaded. Se já houver um assembly referenciado carregado no banco de dados devido a uma instrução CREATE ASSEMBLY anterior, esse assembly não será carregado, mas estará disponível para o assembly raiz.If a referenced assembly is already uploaded to the database because of an earlier CREATE ASSEMBLY statement, this assembly is not uploaded but is available to the root assembly. Se não houver um assembly dependente carregado, mas o SQL ServerSQL Server não conseguir localizar seu arquivo de manifesto no diretório de origem, CREATE ASSEMBLY retornará um erro.If a dependent assembly was not previously uploaded, but SQL ServerSQL Server cannot locate its manifest file in the source directory, CREATE ASSEMBLY returns an error.

Se algum dos assemblies dependentes referenciados pelo assembly raiz ainda não foi carregado no banco de dados mas foi carregado implicitamente com o assembly raiz, ambos terão o mesmo conjunto de permissões que o assembly do nível raiz.If any dependent assemblies referenced by the root assembly are not already in the database and are implicitly loaded together with the root assembly, they have the same permission set as the root level assembly. 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.If the dependent assemblies must be created by using a different permission set than the root-level assembly, they must be uploaded explicitly before the root level assembly with the appropriate permission set.

Validação de assemblyAssembly Validation

O SQL ServerSQL Server executa verificações nos binários de assembly carregados pela instrução CREATE ASSEMBLY para garantir o seguinte:SQL ServerSQL Server performs checks on the assembly binaries uploaded by the CREATE ASSEMBLY statement to guarantee the following:

  • 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.The assembly binary is well formed with valid metadata and code segments, and the code segments have valid Microsoft Intermediate language (MSIL) instructions.

  • O conjunto de assemblies do sistema ao qual ele faz referência é um dos assemblies a seguir, aos quais SQL ServerSQL Server dá suporte: Microsoft.Visualbasic.dll, Mscorlib.dll, System.Data.dll, System.dll, System.Xml.dll, Microsoft.Visualc.dll, Custommarshallers.dll, System.Security.dll, System.Web.Services.dll, System.Data.SqlXml.dll, System.Core.dll e System.Xml.Linq.dll.The set of system assemblies it references is one of the following supported assemblies in SQL ServerSQL Server: Microsoft.Visualbasic.dll, Mscorlib.dll, System.Data.dll, System.dll, System.Xml.dll, Microsoft.Visualc.dll, Custommarshallers.dll, System.Security.dll, System.Web.Services.dll, System.Data.SqlXml.dll, System.Core.dll, and System.Xml.Linq.dll. Outros assemblies de sistema podem ser referenciados, mas eles devem ser registrados explicitamente no banco de dados.Other system assemblies can be referenced, but they must be explicitly registered in the database.

  • Para assemblies criados usando os conjuntos de permissões SAFE ou EXTERNAL ACCESS:For assemblies created by using SAFE or EXTERNAL ACCESS permission sets:

    • O código do assembly deve ser do tipo seguro.The assembly code should be type-safe. A segurança do tipo é estabelecida pela execução do verificador do CLR no assembly.Type safety is established by running the common language runtime verifier against the assembly.

    • O assembly não deve conter membros de dados estáticos em suas classes a menos que eles sejam marcados como somente leitura.The assembly should not contain any static data members in its classes unless they are marked as read-only.

    • As classes do assembly não podem conter métodos finalizadores.The classes in the assembly cannot contain finalizer methods.

    • As classes ou os métodos do assembly devem ser anotados somente com os atributos de código permitidos.The classes or methods of the assembly should be annotated only with allowed code attributes. Para obter mais informações, confira Atributos personalizados para rotinas do CLR (Common Language Runtime).For more information, see Custom Attributes for CLR Routines.

Além das verificações anteriores realizadas durante a execução de CREATE ASSEMBLY, existem duas verificações adicionais que são realizadas no tempo de execução do código no assembly:Besides the previous checks that are performed when CREATE ASSEMBLY executes, there are additional checks that are performed at execution time of the code in the assembly:

  • A chamada de determinadas APIs do MicrosoftMicrosoft.NET Framework.NET Framework que requerem uma permissão de acesso de código específica poderá falhar se o conjunto de permissões do assembly não incluir essa permissão.Calling certain MicrosoftMicrosoft.NET Framework.NET Framework APIs that require a specific Code Access Permission may fail if the permission set of the assembly does not include that permission.

  • Para assemblies SAFE e EXTERNAL_ACCESS, qualquer tentativa de chamar APIs .NET Framework.NET Framework que são anotadas com certos HostProtectionAttributes falhará.For SAFE and EXTERNAL_ACCESS assemblies, any attempt to call .NET Framework.NET Framework APIs that are annotated with certain HostProtectionAttributes will fail.

Para obter mais informações, confira Criando assemblies.For more information, see Designing Assemblies.

PermissõesPermissions

Requer a permissão CREATE ASSEMBLY.Requires CREATE ASSEMBLY permission.

Se PERMISSION_SET = EXTERNAL_ACCESS for especificado, a permissão EXTERNAL ACCESS ASSEMBLY será necessária no servidor.If PERMISSION_SET = EXTERNAL_ACCESS is specified, requiresEXTERNAL ACCESS ASSEMBLY permission on the server. Se PERMISSION_SET = UNSAFE for especificado, a permissão UNSAFE ASSEMBLY será necessária no servidor.If PERMISSION_SET = UNSAFE is specified, requires UNSAFE ASSEMBLY permission on the server.

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.User must be the owner of any assemblies that are referenced by the assembly that are to be uploaded if the assemblies already exist in the database. Para carregar um assembly usando um caminho de arquivo, o usuário atual precisa ter um logon autenticado pelo Windows ou ser membro da função de servidor fixa sysadmin.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 para os arquivos que estão sendo carregados na instrução.The Windows login of the user that executes CREATE ASSEMBLY must have read permission on the share and the files being loaded in the statement.

Permissões com a segurança estrita do CLRPermissions with CLR strict security

As seguintes permissões necessárias para criar um assembly CLR quando o CLR strict security está habilitado:The following permissions required to create a CLR assembly when CLR strict security is enabled:

  • O usuário deve ter a permissão CREATE ASSEMBLYThe user must have the CREATE ASSEMBLY permission
  • Além disso, uma das seguintes condições também deve ser verdadeira:And one of the following conditions must also be true:
    • O assembly é assinado com um certificado ou uma chave assimétrica que tem um logon correspondente à permissão UNSAFE ASSEMBLY no servidor.The assembly is signed with a certificate or asymmetric key that has a corresponding login with the UNSAFE ASSEMBLY permission on the server. A assinatura do assembly é recomendada.Signing the assembly is recommended.
    • 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.The database has the TRUSTWORTHY property set to ON, and the database is owned by a login that has the UNSAFE ASSEMBLY permission on the server. Essa opção não é recomendada.This option is not recommended.

Para obter mais informações sobre conjuntos de permissões de assembly, confira Criando assemblies.For more information about assembly permission sets, see Designing Assemblies.

ExemplosExamples

Exemplo A: Criando um assembly a partir de uma dllExample A: Creating an assembly from a dll

Aplica-se a: do SQL Server 2008SQL Server 2008 ao SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

O exemplo a seguir supõe que há exemplos do Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine instalados no local padrão do computador local e que o aplicativo de exemplo HelloWorld.csproj esteja compilado.The following example assumes that the Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine samples are installed in the default location of the local computer and the HelloWorld.csproj sample application is compiled. Para obter mais informações, confira Exemplo de Olá, Mundo.For more information, see 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;  

Importante

O Banco de Dados SQL do Azure não é compatível com a criação de um assembly a partir de um arquivo.Azure SQL Database does not support creating an assembly from a file.

Exemplo B: Criando um assembly a partir de bits do assemblyExample B: Creating an assembly from assembly bits

Aplica-se a: do SQL Server 2008SQL Server 2008 ao SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Substitua os bits de exemplo (que não são válidos ou não estão completos) pelos bits do assembly.Replace the sample bits (which are not complete or valid) with your assembly bits.

CREATE ASSEMBLY HelloWorld  
    FROM 0x4D5A900000000000  
WITH PERMISSION_SET = SAFE;  

Consulte TambémSee Also

ALTER ASSEMBLY (Transact-SQL) ALTER ASSEMBLY (Transact-SQL)
DROP ASSEMBLY (Transact-SQL) DROP ASSEMBLY (Transact-SQL)
CREATE FUNCTION (Transact-SQL) CREATE FUNCTION (Transact-SQL)
CREATE PROCEDURE (Transact-SQL) CREATE PROCEDURE (Transact-SQL)
CREATE TRIGGER (Transact-SQL) CREATE TRIGGER (Transact-SQL)
CREATE TYPE (Transact-SQL) CREATE TYPE (Transact-SQL)
CREATE AGGREGATE (Transact-SQL) CREATE AGGREGATE (Transact-SQL)
EVENTDATA (Transact-SQL) EVENTDATA (Transact-SQL)
Cenários de uso e exemplos para a integração do CLR (Common Language Runtime)Usage Scenarios and Examples for Common Language Runtime (CLR) Integration