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.306 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.