CREATE ASSEMBLY (Transact-SQL)

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.

Ícone de vínculo de tópicoConvenções de sintaxe Transact-SQL

Sintaxe

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 }

Argumentos

  • assembly_name
    É o nome do assembly. O nome deve ser exclusivo no banco de dados e um identificadorválido.

  • AUTHORIZATION owner_name
    Especifica o nome de um usuário ou de uma função como proprietário do assembly. O owner_name deve ser o nome de uma função da qual o usuário atual seja membro, ou o usuário atual deve ter permissão IMPERSONATE em owner_name. Se não estiver especificado, a propriedade será conferida ao usuário atual.

  • <client_assembly_specifier>
    Especifica o caminho local ou a localização na rede onde está o assembly que está sendo carregado, além do nome do arquivo de manifesto correspondente 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 suporta o carregamento de assemblies com vários módulos. O SQL Server também procura assemblies dependentes desse assembly no mesmo lugar e as carrega com o mesmo proprietário do assembly do nível raiz. Se esses assemblies dependentes não forem encontrados e eles já 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 deles deve ser o mesmo proprietário do assembly recém-criado.

    <client_assembly_specifier> não poderá ser especificado se o usuário que fez logon estiver sendo representado.

  • <assembly_bits>
    É a lista de valores binários que compõe 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. Qualquer valor que não corresponda a dependências do assembly raiz será ignorado.

  • varbinary_literal
    É um varbinary literal.

  • varbinary_expression
    É uma expressão do tipo varbinary.

  • PERMISSION_SET { SAFE | EXTERNAL_ACCESS | UNSAFE }
    Especifica um conjunto de permissões de acesso de código que são concedidas ao assembly quando ele é acessado pelo SQL Server. Se não especificado, SAFE será aplicado por padrão.

    É recomendável o uso de SAFE. SAFE é o conjunto de permissões mais restritivo. 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.

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

    UNSAFE concede aos assemblies acesso irrestrito aos recursos, internos ou externos, de uma instância do SQL Server. O código executado a partir de um assembly UNSAFE pode chamar um código não gerenciado.

    Observação sobre segurançaObservação sobre segurança

    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 Server.

    É recomendável o uso de EXTERNAL_ACCESS para assembly que acessam recursos fora de uma instância do SQL 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. Isso porque o código de assemblies EXTERNAL_ACCESS é executado, por padrão, em uma conta de serviço do SQL Server e acessa recursos externos por essa conta, exceto se o código representar explicitamente o chamador. 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 Server. Para obter mais informações sobre representação, consulte Segurança da integração CLR.

    A especificação de UNSAFE proporciona ao código do assembly liberdade total para executar operações no espaço de processo do SQL Server, o que pode comprometer a robustez do SQL Server. Assemblies UNSAFE também podem potencialmente subverter o sistema de segurança do SQL Server ou do CLR. Permissões UNSAFE devem ser concedidas exclusivamente para assemblies altamente confiáveis. Somente membros da função de servidor fixa sysadmin podem criar e alterar assemblies UNSAFE.

    Para obter mais informações sobre conjuntos de permissões de assembly, consulte Criando assemblies.

Comentários

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.

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

Ao tentar acessar o assembly especificado em <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 é repassada ao 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).

Além do assembly raiz especificado por assembly_name, o SQL Server tenta carregar todos os demais assemblies que são referenciados pelo assembly raiz que está sendo carregado. 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. Se não houver um assembly dependente carregado, mas o SQL Server não conseguir localizar seu arquivo de manifesto no diretório de origem, CREATE ASSEMBLY retornará um erro.

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. 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.

Validação de assembly

O SQL Server executa verificações nos binários de assembly carregados pela instrução CREATE ASSEMBLY para garantir o seguinte:

  • 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 de sistema a que ele faz referência é um dos seguintes assemblies suportados pelo SQL 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 e System.Xml.Linq.dll. Outros assemblies de sistema podem ser referenciados, mas eles devem ser registrados explicitamente no banco de dados.

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

    • 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 membros de dados estáticos em suas classes a menos que eles sejam marcados como somente leitura.

    • As classes do 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 Atributos personalizados para rotinas de CLR.

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:

  • A chamada de determinadas APIs do Microsoft.NET Framework que requerem uma Permissão de Acesso ao Código específica pode falhar se o conjunto de permissões não contiver essa permissão.

  • Para assemblies SAFE e EXTERNAL_ACCESS, qualquer tentativa de chamar APIs .NET Framework que são anotadas com certos HostProtectionAttributes falhará.

Para obter mais informações, consulte Criando assemblies.

Permissões

Requer a permissão CREATE ASSEMBLY.

Se PERMISSION_SET = EXTERNAL_ACCESS for especificado, o logon do SQL Server deverá ter a permissão EXTERNAL ACCESS ASSEMBLY no servidor. Se PERMISSION_SET = UNSAFE for especificado, será necessária a associação à função de servidor fixa sysadmin.

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. Para carregar um assembly usando um caminho de arquivo, o usuário atual deve ser um logon autenticado do Windows ou um membro da função de servidor fixa sysadmin. 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.

Para obter mais informações sobre conjuntos de permissões de assembly, consulte Criando assemblies.

Exemplos

O exemplo a seguir supõe que há exemplos do Mecanismo de Banco de Dados do SQL Server instalados no local padrão do computador local e que o aplicativo de exemplo HelloWorld.csproj esteja compilado. Para obter mais informações, consulte Hello World Sample.

DECLARE @SamplesPath nvarchar(1024)
SELECT @SamplesPath = REPLACE(physical_name, 
    'Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\master.mdf', 
    'Microsoft SQL Server\90\Samples\Engine\Programmability\CLR\') 
FROM master.sys.database_files 
WHERE name = 'master';
CREATE ASSEMBLY HelloWorld 
FROM @SamplesPath + 'HelloWorld\CS\HelloWorld\bin\debug\HelloWorld.dll'
WITH PERMISSION_SET = SAFE;