Como atualizar um assembly CLR sem descartar o assembly do SQL Server

17

Como posso atualizar uma dll de assembly (ou procedimento) de CLR sem ter que descartar e recriar o assembly no SQL Server (2008 R2)?

Como está agora, se eu atualizar um assembly (por exemplo, para adicionar uma nova função), o SQL Server não honrará a dll atualizada até que eu solte o assembly:

DROP ASSEMBLY CLRFunctions

Msg 6590, Level 16, State 1, Line 1
DROP ASSEMBLY failed because 'CLRFunctions' is referenced by object 'NormalizeString'.

Mas antes que eu possa descartar o assembly, primeiro devo soltar todas as funções que fazem referência a ele:

DROP FUNCTION NormalizeString
DROP FUNCTION RemoveDiacritics
DROP FUNCTION RemoveCombiningDiacritics
DROP FUNCTION CombineLigatures
....
DROP FUNCTION PseudolocalizeArabic

E então eu posso descartar o assembly:

DROP ASSEMBLY CLRFunctions

Agora eu tenho que " criar " o assembly:

CREATE ASSEMBLY CLRFunctions FROM 'c:\foos\CLRFunctions.dll';

E agora eu tenho que caçar a declaração de todos os UDFs que foram registrados antes de excluí-los.

Eu prefiro atualizar um assembly, e o SQL Server começa a usá-lo.

Atualização : eu tentei DBCC FREEPROCCACHE aleatoriamente para forçar uma "recompilação", mas o SQL Server ainda usa o código antigo.

Atualização : excluí a dll CLRFunctions.dll do assembly e o SQL Server ainda pode executar o código (sem código que deve ser impossível).

    
por Ian Boyd 19.10.2011 / 20:50

3 respostas

14

Acho que você está procurando por alter assembly . De BOL:

If the FROM clause is specified, ALTER ASSEMBLY updates the assembly with respect to the latest copies of the modules provided. Because there might be CLR functions, stored procedures, triggers, data types, and user-defined aggregate functions in the instance of SQL Server that are already defined against the assembly, the ALTER ASSEMBLY statement rebinds them to the latest implementation of the assembly. To accomplish this rebinding, the methods that map to CLR functions, stored procedures, and triggers must still exist in the modified assembly with the same signatures. The classes that implement CLR user-defined types and user-defined aggregate functions must still satisfy the requirements for being a user-defined type or aggregate.

Um dos exemplos na mesma página parece que seria o truque:

ALTER ASSEMBLY ComplexNumber 
FROM 'C:\Program Files\Microsoft SQL Server\Tools\Samples33\Engine\Programmability\CLR\UserDefinedDataType\CS\ComplexNumber\obj\Debug\ComplexNumber.dll' 
    
por 19.10.2011 / 22:11
6

Para adicionar a resposta de Ben Thul, isso pode ser feito remotamente com bastante facilidade via GUI do SQL Server Management Studio .

  1. No Pesquisador de Objetos do seu banco de dados - > Programabilidade, clique com o botão direito do mouse em Assemblies e selecione 'New Assembly ...'.

  2. Navegue até a sua DLL atualizada.

  3. Em vez de clicar em 'OK' (o que falhará, já que uma montagem com o mesmo nome já existe), clique em 'Script' na parte superior da janela Nova montagem.

    Você será colocado em uma Consulta SQL que inclui uma linha 'CREATE ASSEMBLY' seguida por um blob enorme que é a DLL que você acabou de selecionar.

  4. Mude 'CREATE' para 'ALTER' e depois execute!

O Script também criou uma linha de 'AUTHORIZATION' para mim que eu tinha que remover antes de executar; sua milhagem pode variar.

Espero que isso ajude alguém sem acesso ao sistema de arquivos em seus servidores.

Espero que a Microsoft torne isso uma operação de primeira classe no SSMS algum dia, mas isso é uma solução bastante fácil até que eles o façam.

    
por 08.03.2016 / 00:24
1

Eu encontrei uma dica para a resposta em Stackoverflow :

ALTER ASSEMBLY CLRFunctions FROM 'c:\foos\CLRFunctions.dll';
    
por 19.10.2011 / 21:46