Como atualizar uma dll de assembly de função (ou procedimento) do CLR sem precisar soltar 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é eu largar 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, devo primeiro descartar todas as funções que o referenciam:
DROP FUNCTION NormalizeString
DROP FUNCTION RemoveDiacritics
DROP FUNCTION RemoveCombiningDiacritics
DROP FUNCTION CombineLigatures
....
DROP FUNCTION PseudolocalizeArabic
E então eu posso largar a montagem:
DROP ASSEMBLY CLRFunctions
Agora eu tenho que " criar " a montagem:
CREATE ASSEMBLY CLRFunctions FROM 'c:\foos\CLRFunctions.dll';
E agora eu tenho que caçar a declaração de todas as UDFs que foram registradas antes de excluí-las.
eu prefiro atualizar um assembly e fazer com que o SQL Server comece a usá-lo.
Atualização : tentei aleatoriamente DBCC FREEPROCCACHE
forçar uma "recompilação", mas o SQL Server ainda usa o código antigo.
Atualização : excluí a dll do assembly CLRFunctions.dll
e o SQL Server ainda pode executar o código (sem o código que deveria ser impossível).
fonte
CREATE ASSEMBLY
eALTER ASSEMBLY
terão um blob que representa a montagem. Prove isso você mesmo, acessando qualquer banco de dados criado em 2008+ e vá para Programmability -> Assemblies e crie um script para criar o assembly Microsoft.SqlServer.Types. Esse varbinário gigantesco é a assembléia . Como isso se aplica à sua situação, implemente seu assembly na instância local, faça umALTER ASSEMBLY
script e faça um script.Para adicionar à resposta de Ben Thul, isso pode ser realizado remotamente com bastante facilidade via GUI do SQL Server Management Studio .
No Pesquisador de objetos do seu banco de dados -> Programação, clique com o botão direito do mouse em Assemblies e selecione 'New Assembly ...'.
Vá para a sua DLL atualizada.
Em vez de clicar em 'OK' (que falhará, pois já existe uma montagem com o mesmo nome), clique em 'Script' na parte superior da janela Nova montagem.
Você será inserido em uma Consulta SQL que inclui uma linha 'CREATE ASSEMBLY' seguida por um enorme blob que é a DLL que você acabou de selecionar.
Mude 'CREATE' para 'ALTER' e depois execute!
O script também criou uma linha de 'AUTORIZAÇÃO' para mim que eu precisei remover antes de executar; sua milhagem pode variar.
Espero que isso ajude alguém sem acesso do sistema de arquivos aos seus servidores.
Espero que a Microsoft faça disso uma operação de primeira classe no SSMS algum dia, mas essa é uma solução bastante fácil até que eles o façam.
fonte
Encontrei uma dica para a resposta no Stackoverflow :
fonte
ALTER ASSEMBLY
... (UPDATE
está no DML,ALTER
está na DDL.)