ALTER ASSEMBLY (Transact-SQL)

Aplica-se a: SQL Server Instância Gerenciada de SQL do Azure

Altera um assembly pela modificação das propriedades do catálogo do SQL Server de um assembly. ALTER ASSEMBLY o atualiza para a cópia mais recente dos módulos do .NET Framework que contêm sua implementação e adiciona ou remove arquivos associados a ele. Os assemblies são criados usando CREATE ASSEMBLY.

Convenções de sintaxe de Transact-SQL

Sintaxe

ALTER ASSEMBLY assembly_name
    [ FROM <client_assembly_specifier> | <assembly_bits> ]
    [ WITH <assembly_option> [ , ...n ] ]
    [ DROP FILE { file_name [ , ...n ] | ALL } ]
    [ ADD FILE FROM
    {
        client_file_specifier [ AS file_name ]
      | file_bits AS file_name
    } [ , ...n ]
    ] [ ; ]
<client_assembly_specifier> ::=
    '\\computer_name\share-name\ [ path\ ] manifest_file_name '
  | '[ local_path\ ] manifest_file_name'

<assembly_bits> ::=
    { varbinary_literal | varbinary_expression }

<assembly_option> ::=
    PERMISSION_SET = { SAFE | EXTERNAL_ACCESS | UNSAFE }
  | VISIBILITY = { ON | OFF }
  | UNCHECKED DATA

Observação

Para exibir a sintaxe do Transact-SQL para o SQL Server 2014 (12.x) e versões anteriores, confira a Documentação das versões anteriores.

Argumentos

assembly_name

O nome do assembly que você deseja modificar. assembly_name já precisa existir no banco de dados.

FROM <client_assembly_specifier> | <assembly_bits>

Atualiza um assembly à cópia mais recente dos módulos do .NET Framework que contêm a implementação desse assembly. Esta opção pode ser usada somente se não houver nenhum arquivo associado ao assembly especificado.

<client_assembly_specifier> especifica a localização, na rede ou no local, onde fica o assembly que está sendo atualizado. O local de rede inclui o nome do computador, o nome do compartilhamento e um caminho dentro desse compartilhamento. manifest_file_name especifica o nome do arquivo que contém o manifesto do assembly.

Importante

O Banco de Dados SQL do Azure não dá suporte à referência a um arquivo.

<assembly_bits> é o valor binário do assembly.

Instruções separadas ALTER ASSEMBLY devem ser emitidas para todos os assemblies dependentes que também exigem atualização.

PERMISSION_SET = { SAFE | EXTERNAL_ACCESS | UNSAFE }

Especifica a propriedade do conjunto de permissões de acesso ao código do .NET Framework do assembly. Para obter mais informações sobre essa propriedade, consulte CREATE ASSEMBLY.

A PERMISSION_SET opção é afetada pela opção de segurança clr strict. Quando clr strict security está habilitada, todos os assemblies são tratados como UNSAFE.

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

VISIBILITY = { ON | OFF }

Indica se o assembly está visível para a criação de funções CLR (Common Language Runtime), procedimentos armazenados, disparadores, tipos de dados definidos pelo usuário e funções de agregação definidas pelo usuário em relação a ele. Se definido como OFF, o assembly deve ser chamado somente por outros assemblies. Se houver objetos de banco de dados CLR existentes já criados no assembly, a visibilidade do assembly não poderá ser alterada. Todos os assemblies referenciados por assembly_name são carregados como não visíveis por padrão.

UNCHECKED DATA

Por padrão, ALTER ASSEMBLY falha se precisar verificar a consistência de linhas de tabela individuais. Esta opção permite adiar as verificações para um momento posterior usando DBCC CHECKTABLE. Se especificado, o SQL Server executará a ALTER ASSEMBLY instrução mesmo se houver tabelas no banco de dados que contenham as seguintes condições:

  • Colunas computadas persistentes que referenciem métodos no assembly, direta ou indiretamente, por meio de funções ou métodos Transact-SQL.

  • CHECK restrições que direta ou indiretamente fazem referência a métodos no assembly.

  • Colunas de um tipo CLR definido pelo usuário que dependem do assembly e o tipo implementa um UserDefined formato de (nãoNative) serialização.

  • Colunas de um tipo CLR definido pelo usuário que fazem referência a exibições criadas usando WITH SCHEMABINDINGo .

Se houver restrições CHECK , elas serão desabilitadas e marcadas como não confiáveis. Quaisquer tabelas que contenham colunas dependentes do assembly serão marcadas como contendo dados não verificados até que essas tabelas sejam verificadas explicitamente.

Somente membros das funções de banco de dados fixas db_owner e db_ddlowner podem especificar essa opção.

Requer a ALTER ANY SCHEMA permissão para especificar essa opção.

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

SOLTAR ARQUIVO { file_name [ ,... n ] | TODOS }

Remove do banco de dados o nome de arquivo associado ao assembly ou todos os arquivos associados ao assembly. Se usado com ADD FILE o seguinte, DROP FILE executa primeiro. Isso permite que você substitua um arquivo pelo mesmo nome de arquivo.

Observação

Essa opção não está disponível em um banco de dados independente ou no Banco de Dados SQL do Azure.

ADICIONAR ARQUIVO DE { client_file_specifier [ AS file_name ] | file_bits COMO file_name }

Carrega um arquivo a ser associado ao assembly, como código-fonte, arquivos de depuração ou outras informações relacionadas, no servidor e fica visível na exibição do sys.assembly_files catálogo. client_file_specifier especifica o local do qual o arquivo deve ser carregado. Nesse caso, file_bits pode ser usado para especificar a lista de valores binários que compõem o arquivo. file_name especifica o nome sob o qual o arquivo deve ser armazenado na instância do SQL Server. file_name precisará ser especificado se file_bits for especificado e será opcional se client_file_specifier for especificado. Se file_name não for especificado, a parte file_name do client_file_specifier será usada como file_name.

Observação

Essa opção não está disponível em um banco de dados independente ou no Banco de Dados SQL do Azure.

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 PERMISSION_SET = SAFE pode ser capaz de acessar recursos externos do sistema, chamar código não gerenciado e adquirir privilégios de administrador de sistema. No SQL Server 2017 (14.x) e versões posteriores, a sp_configure opção 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 clr strict security opção pode ser desabilitada 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 UNSAFE ASSEMBLY permissão no master banco de dados. 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. Para obter mais informações, consulte sys.sp_add_trusted_assembly.

Comentários

ALTER ASSEMBLY não interrompe as sessões em execução no momento que estão executando código no assembly que está sendo modificado. As sessões atuais concluem a execução usando os bits inalterados do assembly.

Se a FROM cláusula for especificada, ALTER ASSEMBLY atualiza o assembly em relação às cópias mais recentes dos módulos fornecidos. Como pode haver funções CLR, procedimentos armazenados, gatilhos, tipos de dados e funções agregadas definidas pelo usuário na instância do SQL Server que já estão definidas no assembly, a ALTER ASSEMBLY instrução os reassocia à implementação mais recente do assembly. Para realizar essa nova associação, os métodos mapeados para funções CLR, procedimentos armazenados e disparadores ainda deverão existir no assembly modificado com as mesmas assinaturas. As classes que implementam tipos CLR definidos pelo usuário e funções de agregação definidas pelo usuário ainda deverão satisfazer os requisitos para serem uma agregação ou tipo definido pelo usuário.

Cuidado

Se WITH UNCHECKED DATA não for especificado, o SQL Server tentará impedir ALTER ASSEMBLY a execução se a nova versão do assembly afetar os dados existentes em tabelas, índices ou outros sites persistentes. No entanto, o SQL Server não garante que colunas, índices, exibições indexadas ou expressões computadas sejam consistentes com as rotinas e os tipos subjacentes quando o assembly CLR for atualizado. Tenha cuidado ao executar ALTER ASSEMBLY para garantir que não haja uma incompatibilidade entre o resultado de uma expressão e um valor baseado nessa expressão armazenada no assembly.

ALTER ASSEMBLY Altera a versão do assembly. A cultura e o token de chave pública do assembly permanecem os mesmos.

A ALTER ASSEMBLY instrução não pode ser usada para alterar os seguintes itens:

  • As assinaturas de funções CLR, funções de agregação, procedimentos armazenados e disparadores em uma instância do SQL Server que façam referência ao assembly. ALTER ASSEMBLY falha quando o SQL Server não pode reassociar objetos de banco de dados do .NET Framework no SQL Server com a nova versão do assembly.

  • As assinaturas de métodos no assembly que são chamados a partir de outros assemblies.

  • A lista de assemblies que dependem do assembly, conforme referenciado DependentList na propriedade do assembly.

  • A capacidade de indexação de um método, a menos que não existam índices ou colunas computadas persistidas que dependam desse método, seja direta ou indiretamente.

  • O FillRow atributo de nome do método para funções com valor de tabela CLR.

  • A Accumulate assinatura do método and Terminate para agregações definidas pelo usuário.

  • Assemblies do sistema.

  • Propriedade do assembly. Em vez disso, use ALTER AUTHORIZATION .

Além disso, para assemblies que implementam tipos definidos pelo usuário, ALTER ASSEMBLY podem ser usados para fazer apenas as seguintes alterações:

  • Modificar métodos públicos da classe de tipo definida pelo usuário, desde que assinaturas ou atributos não sejam alterados.

  • Adicionar novos métodos públicos.

  • Modificar métodos privados de alguma forma.

Os campos contidos em um tipo definido pelo usuário serializado nativo, incluindo membros de dados ou classes base, não podem ser alterados usando ALTER ASSEMBLY. Não é oferecido suporte a todas as demais alterações.

Se ADD FILE FROM não for especificado, ALTER ASSEMBLY descartará todos os arquivos associados ao assembly.

Se ALTER ASSEMBLY for executado sem a UNCHECKED cláusula data, serão executadas verificações para verificar se a nova versão do assembly não afeta os dados existentes nas tabelas. Dependendo da quantidade de dados que precisa ser verificada, essa etapa pode afetar o desempenho.

Permissões

Requer ALTER permissão no assembly. Os requisitos adicionais são os seguintes:

  • Para alterar um assembly cujo conjunto de permissões existente é EXTERNAL_ACCESS, é necessária EXTERNAL ACCESS ASSEMBLY permissão no servidor.

  • Para alterar um assembly cujo conjunto de permissões existente é UNSAFE necessário UNSAFE ASSEMBLY permissão no servidor.

  • Para alterar o conjunto de permissões de um assembly para EXTERNAL_ACCESS, é necessária EXTERNAL ACCESS ASSEMBLY permissão no servidor.

  • Para alterar o conjunto de permissões de um assembly para UNSAFE, é necessária UNSAFE ASSEMBLY permissão no servidor.

  • A especificação WITH UNCHECKED DATA requer ALTER ANY SCHEMA permissão.

Permissões com a segurança estrita do CLR

As seguintes permissões são necessárias para alterar um assembly CLR quando clr strict security está habilitado:

  • O usuário deve ter a permissão ALTER 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.

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

Exemplos

R. Atualizar um assembly

O exemplo a seguir atualiza o assembly ComplexNumber para a cópia mais recente dos módulos do .NET Framework que contêm a implementação do assembly em questão.

Observação

O assembly ComplexNumber pode ser criado executando os UserDefinedDataType scripts de exemplo. Para obter mais informações, confira Tipo definido pelo usuário.

 ALTER ASSEMBLY ComplexNumber
 FROM 'C:\Program Files\Microsoft SQL Server\130\Tools\Samples\1033\Engine\Programmability\CLR\UserDefinedDataType\CS\ComplexNumber\obj\Debug\ComplexNumber.dll'

Importante

O Banco de Dados SQL do Azure não dá suporte à referência a um arquivo.

B. Adicionar um arquivo para associar a um assembly

O exemplo a seguir carrega o arquivo de código fonte Class1.cs a ser associado ao assembly MyClass. Este exemplo assume que o assembly MyClass já foi criado no banco de dados.

ALTER ASSEMBLY MyClass
ADD FILE FROM 'C:\MyClassProject\Class1.cs';

Importante

O Banco de Dados SQL do Azure não dá suporte à referência a um arquivo.

C. Alterar as permissões de um assembly

O exemplo a seguir altera o conjunto de permissões do assembly ComplexNumber de SAFE para EXTERNAL ACCESS.

ALTER ASSEMBLY ComplexNumber WITH PERMISSION_SET = EXTERNAL_ACCESS;