Hola, chicos,
Buenas noches.

En esta publicación, demostraré cómo resolver un problema muy extraño en SQL Server Reporting Services 2016, que ocurre cuando intentaba eliminar algunos informes móviles y recibí este mensaje de error:

Error al invocar la extensión de autorización.

Como este mensaje no es nada explicativo, decidí intentar analizar los archivos de registro de Reporting Services (generalmente ubicados en “C:\Program Files\Microsoft SQL Server\MSRS13.Sua_Instancia\Reporting Services\LogFiles”) para intentar identificar alguna pista sobre el origen del problema, pero encontré el siguiente mensaje en uno de los archivos:

Microsoft.ReportingServices.Portal.WebHost!library!b!12/02/2016-14:22:00:: e ERROR: Lanzamiento de Microsoft.ReportingServices.Diagnostics.Utilities.AuthorizationExtensionException: Microsoft.ReportingServices.Diagnostics.Utilities.AuthorizationExtensionException: Error al invocar la extensión de autorización. -> System.NullReferenceException: la referencia de objeto no está configurada como una instancia de un objeto.
en Microsoft.ReportingServices.Authorization.SdAndType.GetRightSecDesc(SecurityItemType crtItemType, Hashtable secDescHash, Byte[]& primSecDesc, Byte[]& secSecDesc)
en Microsoft.ReportingServices.Authorization.WindowsAuthorization.InnerCheckAccess(String userName, IntPtr userToken, SecurityItemType itemType, Byte[] secDesc, UInt32& RightsMask, ReportSecDescType rptSecDescType)
en Microsoft.ReportingServices.Authorization.WindowsAuthorization.<>c__DisplayClassa.b__9()
en Microsoft.ReportingServices.Diagnostics.RevertImpersonationContext.<>c__DisplayClass1.b__0(estado del objeto)
en System.Security.SecurityContext.Run (SecurityContext securityContext, devolución de llamada ContextCallback, estado del objeto)
en Microsoft.ReportingServices.Diagnostics.RevertImpersonationContext.Run (devolución de llamada de ContextBody)
en Microsoft.ReportingServices.Authorization.WindowsAuthorization.CheckAccess (Nombre de usuario de cadena, Token de usuario IntPtr, Byte[] secDesc, Operación de carpeta requeridaOperación)
en Microsoft.ReportingServices.Library.Security.<>c__DisplayClass1f.b__1c()
en Microsoft.ReportingServices.Diagnostics.ExtensionBoundary.Invoke (Método m)

Como habrás notado, el mensaje de error no era muy claro. Decidí intentar abrir el informe en la herramienta Microsoft SQL Server Mobile Report Publisher y apareció el siguiente mensaje de error:

sql-server-reporting-services-2016-erro-ao-invocar-extensao-de-autorizacao-5
sql-server-reporting-services-2016-error-al-invocar-extensión-de-autorización-5

Me imagino que este problema se produjo porque había informes que utilizaban un determinado conjunto de datos, que se eliminó sin eliminarse primero del informe (la herramienta no debería permitir la eliminación si hay dependencias).

Resolviendo el problema y eliminando los archivos.

Como no encontraba solución mediante herramientas gráficas, decidí intentar solucionarlo a través de la base de datos, conectándome a la instancia donde estaba instalado Reporting Services y accediendo a la base de datos ReportServer.

Para quienes nunca han utilizado esta base de datos, las 2 tablas principales son:
Conjuntos de datos: Tabla que almacena las relaciones entre conjuntos de datos e informes.

sql-server-reporting-services-ssrs-datasets-table
tabla-de-conjuntos-de-datos-ssrs-de-servicios-de-reportes-del-servidor-sql

Catalogar: Tabla que almacena los informes y toda la estructura y organización de los objetos de Reporting Services. Es la tabla de contenidos principal.

sql-server-reporting-services-ssrs-catalog-table
tabla-catálogo-ssrs-de-servicios-de-informes-del-servidor-sql

Como hubo varios informes con este problema y no pude eliminarlos, los moví a una carpeta llamada "Papelera" y ejecuté las siguientes consultas:

DELETE A
FROM ReportServer.dbo.DataSets A
JOIN ReportServer.dbo.[Catalog] B ON A.ItemID = B.ItemID
WHERE [Path] LIKE '%Lixo%';

DELETE
FROM ReportServer.dbo.[Catalog] 
WHERE [Path] LIKE '%Lixo%';

Como resultado, la carpeta "Papelera" y todos los objetos que contiene se eliminaron exitosamente de la base de datos y ya no aparecen en el portal web de Reporting Services.

Solución manual: editar el archivo del informe

Otra solución para esto sería descargar el archivo del informe y extraerlo a una carpeta (tal como lo hace con un archivo ZIP). Al abrir esta carpeta, encontrará el archivo. fuentes.xml, que contiene los conjuntos de datos utilizados por el informe.

El archivo debería tener un contenido similar a este:

<DataSources>
  <Shared Guid="5430d1fe-c55a-4540-9a6a-d96ca2a39e67" Name="Dataset" WorksheetIndex="0" ServerUri="http://localhost:80/relatorios/" DataItemLocation="/Dataset" Hash="" />
  <Shared Guid="8ea514dc-fc9f-47cf-9fd2-f9e546c4e075" Name="Dataset2" WorksheetIndex="1" ServerUri="http://localhost:80/relatorios/" DataItemLocation="/Dataset2" Hash="" />
</DataSources>

Edite también el archivo metadatos.xml, donde esta parte del fichero es la que nos interesa:

<dataSets>
  <dataSet name="Dataset" type="Shared" mrp:DataSourceType="Shared" mrp:Server="http://localhost:80/relatorios/" mrp:OriginalWorksheet="" mrp:OriginalWorksheetIndex="0" mrp:OriginalPath="" mrp:OriginalUser="">
    <id>5430d1fe-c55a-4540-9a6a-d96ca2a39e67</id>
    <path>/Dataset</path>
    <isParameterized>false</isParameterized>
  </dataSet>
  <dataSet name="Dataset2" type="Shared" mrp:DataSourceType="Shared" mrp:Server="http://localhost:80/relatorios/" mrp:OriginalWorksheet="" mrp:OriginalWorksheetIndex="1" mrp:OriginalPath="" mrp:OriginalUser="">
    <id>8ea514dc-fc9f-47cf-9fd2-f9e546c4e075</id>
    <path>/Dataset2</path>
    <isParameterized>false</isParameterized>
  </dataSet>
</dataSets>

Ahora edite el archivo definición.xml, que contiene todos los objetos que componen el informe, y busca todos los objetos cuya entrada sea el nombre del conjunto de datos excluido. El extracto que estamos analizando son los nodos descendientes de la etiqueta y tienen esta estructura:

<GalleryElement Name="SimpleDataGrid" Type="Microsoft.ReportingServices.MobileReportPublisher.Gallery.SimpleDataGrid, Microsoft.ReportingServices.MobileReportPublisher.Gallery, Version=1.0.3895.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" Accent="False" AggregateByCategory="False" AggregateByTime="False" RowNumbers="Auto">
  <SchemaItem Id="Data" Input="Dataset2" AggregationRule="None" Filters="" />
  <Title>Grade de dados simples 1</Title>
  <SubTitle></SubTitle>
  <ColumnDefinitions>
    <GridViewTextColumnDefinition Title="instance_id" ColumnType="Number" AggregationType="None" IsVisible="True" ValueColumn="instance_id" StringFormat="General" />
    <GridViewTextColumnDefinition Title="job_id" ColumnType="Text" IsVisible="True" ValueColumn="job_id" />
    <GridViewTextColumnDefinition Title="step_id" ColumnType="Number" AggregationType="None" IsVisible="True" ValueColumn="step_id" StringFormat="General" />
    <GridViewTextColumnDefinition Title="step_name" ColumnType="Text" IsVisible="True" ValueColumn="step_name" />
    <GridViewTextColumnDefinition Title="sql_message_id" ColumnType="Number" AggregationType="None" IsVisible="True" ValueColumn="sql_message_id" StringFormat="General" />
    <GridViewTextColumnDefinition Title="sql_severity" ColumnType="Number" AggregationType="None" IsVisible="True" ValueColumn="sql_severity" StringFormat="General" />
    <GridViewTextColumnDefinition Title="message" ColumnType="Text" IsVisible="True" ValueColumn="message" />
    <GridViewTextColumnDefinition Title="run_status" ColumnType="Number" AggregationType="None" IsVisible="True" ValueColumn="run_status" StringFormat="General" />
    <GridViewTextColumnDefinition Title="run_date" ColumnType="Number" AggregationType="None" IsVisible="True" ValueColumn="run_date" StringFormat="General" />
    <GridViewTextColumnDefinition Title="run_time" ColumnType="Number" AggregationType="None" IsVisible="True" ValueColumn="run_time" StringFormat="General" />
    <GridViewTextColumnDefinition Title="run_duration" ColumnType="Number" AggregationType="None" IsVisible="True" ValueColumn="run_duration" StringFormat="General" />
    <GridViewTextColumnDefinition Title="operator_id_emailed" ColumnType="Number" AggregationType="None" IsVisible="True" ValueColumn="operator_id_emailed" StringFormat="General" />
    <GridViewTextColumnDefinition Title="operator_id_netsent" ColumnType="Number" AggregationType="None" IsVisible="True" ValueColumn="operator_id_netsent" StringFormat="General" />
    <GridViewTextColumnDefinition Title="operator_id_paged" ColumnType="Number" AggregationType="None" IsVisible="True" ValueColumn="operator_id_paged" StringFormat="General" />
    <GridViewTextColumnDefinition Title="retries_attempted" ColumnType="Number" AggregationType="None" IsVisible="True" ValueColumn="retries_attempted" StringFormat="General" />
    <GridViewTextColumnDefinition Title="server" ColumnType="Text" IsVisible="True" ValueColumn="server" />
  </ColumnDefinitions>
</GalleryElement>

Por último, dentro de la carpeta "fecha", elimine el archivo .json cuyo título es el nombre del conjunto de datos eliminado. Ahora guarde todo en el archivo .RSMOBILE que descargó y editó y abra ese archivo en Mobile Report Publisher.

Listo. Su informe se abre nuevamente, sin el conjunto de datos eliminado. Ahora puedes publicarlo nuevamente.

Espero que hayas disfrutado del post y hasta luego.