Clique no banner para conhecer e adquirir o meu treinamento de Bancos de Dados no Azure

CLR – Resolvendo o problema System.Security.Permissions.FileIOPermission no SQL Server

Visualizações: 4.139 views
Tempo de Leitura: 3 minutos

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:

CLR Assembly Error

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:

CLR Assembly Properties - Permission Set

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:
CLR Assembly Properties - Permission Set 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:

CLR Assembly Permission Set 2

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:

CLR Assembly Fix 2

CLR Assembly Fix

É isso aí!
Obrigado pela visita e atĂ© o prĂ³ximo post.