Hola, chicos,
¡Buen día!
Hoy voy a hablar sobre un problema que puede ocurrir ocasionalmente con ensamblados CLR que usan archivos DLL no compatibles (por ejemplo: System.DirectoryServices) y se compilaron con el permiso UNRESTRICTED (INSEGURO) o ACCESO EXTERNO. Al intentar utilizar un SP o función que requiere este tipo de acceso, nos encontramos con el siguiente mensaje de error:
Se produjo un error de .NET Framework durante la ejecución de la rutina definida por el usuario o del agregado “stpNome_Da_SP”: System.ApplicationException: Error: se produjo un error en Microsoft .NET Framework al intentar cargar el ID de ensamblaje 65591. Es posible que el servidor se esté quedando sin recursos o que no se confíe en el ensamblaje con PERMISSION_SET = EXTERNAL_ACCESS o UNSAFE. Ejecute la consulta nuevamente o consulte la documentación para ver cómo resolver los problemas de confianza del ensamblado. Para obtener más información sobre este error: System.IO.FileLoadException: No se pudo cargar el archivo o ensamblado 'my_assembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' o una de sus dependencias. Excepción de HRESULT: 0x80FC0E21 System.IO.FileLoadException:
Este tipo de error suele ocurrir por alguna actualización del .NET Framework del servidor sin reiniciar el servicio SQL Server, y termina perdiéndose.
Afortunadamente, la solución a este tipo de problemas es muy sencilla, basta con cambiar el permiso de ensamblaje y volver al permiso original. En mi caso, este ensamblado usa el permiso UNRESTRICTED, así que configuro el permiso en EXTERNAL_ACCESS y luego vuelvo a UNRESTRICTED:
USE [master]
GO
GRANT UNSAFE ASSEMBLY TO [Seu_Usuario]
GO
USE [CLR]
GO
ALTER ASSEMBLY Meu_Assembly
WITH PERMISSION_SET = EXTERNAL_ACCESS
GO
ALTER ASSEMBLY Meu_Assembly
WITH PERMISSION_SET = UNSAFE
GO
Este ensamblado realmente necesita el permiso UNRESTRICTED, ya que importé la biblioteca SharpZipLib para usar rutinas de compresión en este CLR y debido a que esta biblioteca usa finalizadores de código (código postcompilado), en realidad no funciona con el permiso EXTERNAL_ACCESS.
Por lo tanto, si intenta realizar estos cambios de permisos desde la pantalla de Management Studio, se encontrará con un mensaje de error como este:
ALTER ASSEMBLY falló porque el tipo "ICSharpCode.SharpZipLib.Tar.TarArchive" en el ensamblado de acceso externo "Meu_Assembly" tiene un finalizador. Los finalizadores no están permitidos en ensamblados de acceso externo. (Proveedor de datos .Net SqlClient)
Por alguna razón, cuando realiza este cambio a través de la línea de código (con los comandos enumerados anteriormente), este tipo de error no ocurre y, por lo tanto, podemos solucionar este problema fácilmente sin tener que publicar nuestro CLR nuevamente.
Si tienes preguntas, sugerencias o críticas, déjalas aquí en los comentarios.
¡Gracias por visitarnos y nos vemos en el próximo post!
Comentários (0)
Carregando comentários…