Reporting Services (SSRS) – Erro ao apagar relatórios móveis (Erro ao invocar a extensão de autorização)

Visualizações: 197
Tempo de Leitura: 4 minutos

Olá pessoal,
Boa noite.

Neste post, vou demonstrar como resolver um problema muito estranho no SQL Server Reporting Services 2016, que ocorre quanto estava tentando apagar alguns relatório móveis e recebia essa mensagem de erro:

Erro ao invocar a extensão de autorização.

Como essa mensagem não é nem um pouco explicativa, resolvi tentar analisar os arquivos de log do Reporting Services (geralmente localizado em “C:\Program Files\Microsoft SQL Server\MSRS13.Sua_Instancia\Reporting Services\LogFiles”) para tentar identificar alguma dica da origem do problema, mas encontrei a seguinte mensagem em um dos arquivos:

Microsoft.ReportingServices.Portal.WebHost!library!b!12/02/2016-14:22:00:: e ERROR: Throwing Microsoft.ReportingServices.Diagnostics.Utilities.AuthorizationExtensionException: , Microsoft.ReportingServices.Diagnostics.Utilities.AuthorizationExtensionException: Erro ao invocar a extensão de autorização. —> System.NullReferenceException: Object reference not set to an instance of an object.
at Microsoft.ReportingServices.Authorization.SdAndType.GetRightSecDesc(SecurityItemType crtItemType, Hashtable secDescHash, Byte[]& primSecDesc, Byte[]& secSecDesc)
at Microsoft.ReportingServices.Authorization.WindowsAuthorization.InnerCheckAccess(String userName, IntPtr userToken, SecurityItemType itemType, Byte[] secDesc, UInt32& rightsMask, ReportSecDescType rptSecDescType)
at Microsoft.ReportingServices.Authorization.WindowsAuthorization.<>c__DisplayClassa.<CheckAccess>b__9()
at Microsoft.ReportingServices.Diagnostics.RevertImpersonationContext.<>c__DisplayClass1.<Run>b__0(Object state)
at System.Security.SecurityContext.Run(SecurityContext securityContext, ContextCallback callback, Object state)
at Microsoft.ReportingServices.Diagnostics.RevertImpersonationContext.Run(ContextBody callback)
at Microsoft.ReportingServices.Authorization.WindowsAuthorization.CheckAccess(String userName, IntPtr userToken, Byte[] secDesc, FolderOperation requiredOperation)
at Microsoft.ReportingServices.Library.Security.<>c__DisplayClass1f.<CheckAccess>b__1c()
at Microsoft.ReportingServices.Diagnostics.ExtensionBoundary.Invoke(Method m)

Como vocês notaram, a mensagem de erro não estava muito clara.. Resolvi tentar abrir o relatório na ferramenta Microsoft SQL Server Mobile Report Publisher, e aparecia a mensagem de erro abaixo:

sql-server-reporting-services-2016-erro-ao-invocar-extensao-de-autorizacao-5

Eu imagino que esse problema ocorreu porque haviam relatórios utilizando um determinado dataset, que foi apagado sem ser removido do relatório antes (A ferramenta não deveria permitir a exclusão caso haja dependências).

Resolvendo o problema e apagando os arquivos

Como não consegui nenhuma solução utilizando as ferramentas gráficas, resolvi tentar resolver isso pelo banco de dados, conectando na instância onde o Reporting Services estava instalado e acessando o database ReportServer.

Para quem nunca utilizou esse database, as 2 principais tabelas são:
Datasets: Tabela que guarda os relacionamentos entre os datasets e os relatórios.

sql-server-reporting-services-ssrs-datasets-table

Catalog: Tabela que guarda os relatórios e toda a estrutura e organização dos objetos do Reporting Services. É a principal tabela de conteúdo.

sql-server-reporting-services-ssrs-catalog-table

Como haviam vários relatórios com esse problema, onde eu não conseguia exclui-los, eu os movi para uma pasta chamada “Lixo” e executei as queries abaixo:

Com isso, a pasta “Lixo” e todos os objetos dentro dela foram apagados no banco de dados com sucesso e deixaram de aparecer no Portal Web do Reporting Services.

Solução manual: Editando o arquivo do relatório

Uma outra solução para isso seria baixar o arquivo do relatório e extrai-lo para uma pasta (igual você faz com um arquivo ZIP). Abrindo essa pasta, você irá encontrar o arquivo sources.xml, que contém os datasets utilizados pelo relatório.

O arquivo deverá ter um conteúdo parecido com esse:

Edite também o arquivo metadata.xml, onde esse trecho do arquivo é o que nos interessa:

Agora edite o arquivo definition.xml, que contém todos os objetos que compõem o relatório, e procure todos objetos onde o input seja o nome do dataset excluído. O trecho que estamos analisando, são os nós descendentes da tag <Elements>, e tem essa estrutura:

Por último, dentro da pasta “data”, apague o arquivo .json cujo título é o nome do dataset excluído. Agora salve tudo de volta no arquivo .RSMOBILE que você baixou e editou e abra esse arquivo no Mobile Report Publisher.

Pronto. Seu relatório está abrindo novamente, sem o dataset excluído. Você já pode publicá-lo novamente.

Espero que tenham gostado do post e até mais.