Quiero forzar el reinicio del AppDomain que SQLCLR está utilizando. ¿Cómo puedo hacer eso además de reiniciar la instancia de SQL Server?
sql-server
sql-clr
Justin Dearing
fuente
fuente
Respuestas:
Sé que esto es un poco brutal, pero ¿qué hay de deshabilitar el CLR y volver a habilitarlo?
fuente
ALTER ASSEMBLY
propagación a través del envío de registros que no volvió a cargar (o al menos no descargó) el dominio de la aplicación fue el error. De cualquier manera, encontré un método aún más fácil que agregué a mi respuesta aquí. Si tuviera la capacidad de probar este nuevo método, sería genial, ya que tengo mucha curiosidad por ver si funciona en el escenario de envío de registros que describió.Hay una solución más elegante que no afectará a todos los demás conjuntos: simplemente cambie el PERMISSION_SET de uno de los conjuntos en el dominio de la aplicación (los dominios de la aplicación son por usuario).
Solo recuerde que deberá volver a establecer el PERMISSION_SET a lo que era. Además, debe acceder a un método en el ensamblaje antes de cambiar el PERMISSION_SET para descargarlo; cambiar un ensamblaje que no está cargado actualmente en un dominio de aplicación que está activo, pero con otro ensamblaje, no tiene ningún efecto en el dominio de la aplicación (los dominios de aplicación son por DB, por usuario, no por ensamblaje).
ACTUALIZACIÓN
El método descrito anteriormente es el enfoque más detallado donde solo descargará ese dominio de aplicación. Pero sí requiere que el ensamblaje se pueda establecer en uno de los otros dos niveles. Para conjuntos marcados como
SAFE
solo será posible siTRUSTWORTHY ON
, oEXTERNAL ACCESS ASSEMBLY
elUNSAFE ASSEMBLY
permiso o el permisoEn este caso, simplemente puede cambiar la
TRUSTWORTHY
configuraciónON
e inmediatamente volver deOFF
nuevo y eso descargará todos los dominios de aplicaciones en esa base de datos en particular:Si de todos modos solo tiene un dominio de aplicación en la base de datos (y sospecho que este es el caso el 95% o más del tiempo), entonces los dos métodos descritos aquí tienen el mismo efecto neto. Y en esa situación, el
ALTER DATABASE
método parece más simple, ya que no requiere especificar un nombre de objeto en particular ni requiere saber cuál era el originalPERMISSION_SET
.TAMBIÉN, si solo tiene un único dominio de aplicación, entonces el
ALTER DATABASE
método es más simple incluso en el caso de que la base de datos ya esté configuradaTRUSTWORTHY ON
o haya configurado el inicio de sesión de base de clave con el permiso apropiado. Si está utilizando un inicio de sesión basado en clave entonces se puede establecerTRUSTWORTHY
queON
a continuación,OFF
de nuevo como se mencionó anteriormente. Pero si ya loTRUSTWORTHY
configuróON
, simplemente inviértalo y configúreloOFF
y luego vuelva inmediatamente aON
:fuente
SELECT * FROM sys.dm_clr_appdomains;
. Dulce.