Olá pessoal,
Bom dia!
Hoje vou falar sobre um problema que de vez em quando pode ocorrer com assemblies CLR que utilizem DLL’s não suportadas (Ex: System.DirectoryServices) e foram compiladas com a permissão UNRESTRICTED (UNSAFE) ou EXTERNAL ACCESS. Ao tentar utilizar uma SP ou função que necessite desse tipo de acesso, nos deparamos com a seguinte mensagem de erro:
A .NET Framework error occurred during execution of user-defined routine or aggregate “stpNome_Da_SP”: System.ApplicationException: Erro : An error occurred in the Microsoft .NET Framework while trying to load assembly id 65591. The server may be running out of resources, or the assembly may not be trusted with PERMISSION_SET = EXTERNAL_ACCESS or UNSAFE. Run the query again, or check documentation to see how to solve the assembly trust issues. For more information about this error: System.IO.FileLoadException: Could not load file or assembly ‘meu_assembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null’ or one of its dependencies. Exception from HRESULT: 0x80FC0E21 System.IO.FileLoadException:
Esse tipo de erro geralmente ocorre devido a alguma atualização no .NET Framework do servidor sem reiniciar o serviço do SQL Server, e ele acaba se perdendo.
Felizmente, a solução para esse tipo de problema é muito fácil, e basta alterar a permissão do assembly e voltar para a permissão original. No meu caso, esse assembly utiliza a permissão UNRESTRICTED, então eu seto a permissão para EXTERNAL_ACCESS e depois volto para a UNRESTRICTED:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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 |
Esse assembly realmente necessita da permissão UNRESTRICTED, uma vez que eu importei a biblioteca SharpZipLib para utilizar rotinas de compactação nesse CLR e por essa biblioteca utilizar finalizadores de código (código pós-compilado), realmente não funciona com a permissão EXTERNAL_ACCESS.
Sendo assim, se você tentar realizar essas alterações de permissões pela tela do Management Studio, você irá se deparar com uma mensagem de erro como essa:
ALTER ASSEMBLY failed because type “ICSharpCode.SharpZipLib.Tar.TarArchive” in external_access assembly “Meu_Assembly” has a finalizer. Finalizers are not allowed in external_access assemblies. (.Net SqlClient Data Provider)
Por algum motivo, quando você realiza essa alteração pela linha de código (com os comandos listados acima) esse tipo de erro não ocorre e assim podemos corrigir esse problema facilmente sem precisar publicar novamente nosso CLR.
Caso você tenha dúvidas, sugestões ou alguma crÃtica, por favor, deixe aqui nos comentários.
Obrigado pela visita e até o próximo post!
Excelente, poderia ter ensinado antes, mas muito bem explicado! Agradeço!