Olá pessoal,
Bom dia!
Neste post vou mostrar pra vocês um problema muito comum durante o desenvolvimento de projetos SQL CLR, que consiste na mensagem de erro abaixo ao tentar executar qualquer operação com arquivos:
Mensagem de erro completa:
Msg 6522, Level 16, State 1, Line 1
A .NET Framework error occurred during execution of user-defined routine or aggregate “fncArquivo_Ler”:
System.Security.SecurityException: Request for the permission of type ‘System.Security.Permissions.FileIOPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089’ failed.
System.Security.SecurityException:
at System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& stackMark, Boolean isPermSet)
at System.Security.CodeAccessPermission.Demand()
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
at System.IO.StreamReader..ctor(String path, Encoding encoding, Boolean detectEncodingFromByteOrderMarks, Int32 bufferSize, Boolean checkHost)
at System.IO.StreamReader..ctor(String path)
at UserDefinedFunctions.fncArquivo_Ler(String Ds_Caminho)
Não sabe o que é CLR, ou não sabe com criar seu primeiro projeto SQLCLR, como publicar ou tem dúvidas sobre essa poderosa ferramenta do SQL Server? Acesse este post e aprenda o básico.
Identificando o problema
O motivo desse erro estar ocorrendo pode ser verificado analisando a forma como o Assembly do SQLCLR foi publicado no servidor:
Como vocês sabem, com a permission set Safe realmente o assembly não terá acesso para manipulação de arquivos, apenas com os nÃveis de permissão External Access ou Unsafe (agora chamado de Unrestricted).
Vamos analisar qual o permission set que está configurada no Visual Studio:
Eis o problema. No Visual Studio está configurado para o assembly ser compilado com o nÃvel de permissão UNSAFE, mas o assembly está sendo criado com o nÃvel de permissao SAFE.
E agora ?
A solução
Pessoal, calma. Isso não é uma falha do Visual Studio. Esse erro está ocorrendo pois um passo importante do post Introdução ao SQL CLR no SQL Server não foi seguido, que é a definição das permissões do projeto (Class Library) que foi importado no nosso projeto CLR:
Basta realizar essa simples alteração e publicar novamente o seu CLR para que ele seja criado corretamente e suas rotinas funcionem conforme o esperado:
É isso aÃ!
Obrigado pela visita e até o próximo post.
Vc é o cara! Já estava ficando maluco com esse problema. Grato.