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

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

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.

SQL, sql server, sql server 2008, sql server 2008 R2, Oracle, Oracle Database, Oracle 11g, Oracle 10g, Oracle 12c, MySQL, Firebird, Consultoria, Consultor, Programador, Programação. Desenvolvedor, Analista de Sistemas, DBA, Criação de website, Criação de Sistema Web, Vitória, Vila Velha, Guarapari, Espírito Santo, ES, Consultoria SQL em VItória, Treinamento, Curso, Prestação de serviço, prestar serviço, freelancer, freela, banco de dados, consultoria em banco de dados, consultor de banco de dados

Deixe uma resposta