¿Cómo puedo actualizar un dll de ensamblaje de función (o procedimiento) CLR sin tener que soltar y volver a crear el ensamblaje en SQL Server (2008 R2)?
Tal como está ahora si actualizo un ensamblaje (por ejemplo, para agregar una nueva función), SQL Server no respetará el dll actualizado hasta que deje el ensamblaje:
DROP ASSEMBLY CLRFunctions
Msg 6590, Level 16, State 1, Line 1
DROP ASSEMBLY failed because 'CLRFunctions' is referenced by object 'NormalizeString'.
Pero antes de que pueda soltar el ensamblaje, primero debo soltar todas las funciones que hacen referencia a él:
DROP FUNCTION NormalizeString
DROP FUNCTION RemoveDiacritics
DROP FUNCTION RemoveCombiningDiacritics
DROP FUNCTION CombineLigatures
....
DROP FUNCTION PseudolocalizeArabic
Y luego puedo soltar el ensamblaje:
DROP ASSEMBLY CLRFunctions
Ahora tengo que " crear " el ensamblaje:
CREATE ASSEMBLY CLRFunctions FROM 'c:\foos\CLRFunctions.dll';
Y ahora tengo que buscar la declaración de todos los UDF que se registraron antes de eliminarlos.
Prefiero actualizar un ensamblado y hacer que SQL Server comience a usarlo.
Actualización : al azar intenté DBCC FREEPROCCACHE
forzar una "recompilación", pero SQL Server todavía usa el código anterior.
Actualización : eliminé el dll de ensamblado CLRFunctions.dll
y SQL Server aún puede ejecutar el código (sin código, eso debería ser imposible).
fuente
CREATE ASSEMBLY
yALTER ASSEMBLY
tomarán una gota que representa la asamblea. Pruébelo usted mismo yendo a cualquier base de datos creada en 2008+ y vaya a Programabilidad -> Ensamblajes y cree la creación del ensamblado Microsoft.SqlServer.Types. Ese varbinary gigantesco es el ensamblaje . Como esto se aplica a su situación, implemente su ensamblado en su instancia local, escríbalo y conviértalo en unALTER ASSEMBLY
script.Para agregar a la respuesta de Ben Thul, esto se puede lograr de forma remota con bastante facilidad a través de la GUI de SQL Server Management Studio .
Bajo el Explorador de objetos para su base de datos -> Programabilidad, haga clic derecho en Ensamblajes y seleccione 'Nuevo ensamblaje ...'.
Busque su DLL actualizada.
En lugar de hacer clic en 'Aceptar' (que fallará, ya que ya existe un ensamblaje con el mismo nombre), haga clic en 'Script' en la parte superior de la ventana Nuevo ensamblaje.
Se lo colocará en una consulta SQL que incluye una línea 'CREAR ENSAMBLAJE' seguida de un gran blob que es la DLL que acaba de seleccionar.
¡Cambie 'CREAR' a 'ALTERAR' y luego ejecute!
El Script también creó una línea de 'AUTORIZACIÓN' para mí que tuve que eliminar antes de ejecutar; Su kilometraje puede variar.
Espero que esto ayude a alguien más sin acceso al sistema de archivos a sus servidores.
Esperemos que Microsoft haga de esta una operación de primera clase en SSMS algún día, pero esta es una solución bastante fácil hasta que lo hagan.
fuente
Encontré una pista sobre la respuesta en Stackoverflow :
fuente
ALTER ASSEMBLY
UPDATE
ALTER