Quiero forzar el reinicio del AppDomain que SQLCLR está utilizando. ¿Cómo puedo hacer eso además de reiniciar la instancia de SQL Server?
Quiero forzar el reinicio del AppDomain que SQLCLR está utilizando. ¿Cómo puedo hacer eso además de reiniciar la instancia de SQL Server?
Respuestas:
Sé que esto es un poco brutal, pero ¿qué hay de deshabilitar el CLR y volver a habilitarlo?
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'clr enabled', 0;
GO
RECONFIGURE;
GO
sp_configure 'clr enabled', 1;
GO
RECONFIGURE;
GO
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).
ALTER ASSEMBLY [AssemblyName] WITH PERMISSION_SET = {1 of the 2 levels that
this assembly is not current at}
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 si
TRUSTWORTHY ON
, oEXTERNAL ACCESS ASSEMBLY
el UNSAFE ASSEMBLY
permiso o el permisoEn este caso, simplemente puede cambiar la TRUSTWORTHY
configuración ON
e inmediatamente volver de OFF
nuevo y eso descargará todos los dominios de aplicaciones en esa base de datos en particular:
ALTER DATABASE CURRENT SET TRUSTWORTHY ON;
ALTER DATABASE CURRENT SET TRUSTWORTHY OFF;
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 original PERMISSION_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é configurada TRUSTWORTHY 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 establecer TRUSTWORTHY
que ON
a continuación, OFF
de nuevo como se mencionó anteriormente. Pero si ya lo TRUSTWORTHY
configuró ON
, simplemente inviértalo y configúrelo OFF
y luego vuelva inmediatamente a ON
:
ALTER DATABASE CURRENT SET TRUSTWORTHY OFF;
ALTER DATABASE CURRENT SET TRUSTWORTHY ON;
SELECT * FROM sys.dm_clr_appdomains;
. Dulce.