2009-07-24 12 views
42

¿Existe una manera fácil de rastrear quién está ejecutando un informe determinado en SSRS 2005, y en qué momento están ejecutando ese informe? Tenemos aproximadamente 80 informes en nuestra implementación de SSRS, y estamos tratando de ver si hay alguno que podamos poner en libertad de manera segura. Si pudiéramos ver fácilmente qué informes no se están utilizando, eso nos ayudaría. ¿Algunas ideas?Uso del informe de seguimiento

Respuesta

3

siempre he encontrado los registros de informes son un poco difícil de usar. Reporting Services mantiene un registro de toda su actividad en una tabla en la base de datos de informes llamada ExecutionLog

Tengo un par de informes i utilizar esa consulta esta tabla, por lo que puede averiguar lo que se utilizan realmente los informes, y quién los usuarios más pesados ​​son

+0

Esto es útil para la presentación de informes fácil y ligera, pero que se limitan a la historia que el servidor almacena (creo que 3 meses) y la seguridad en la base de datos del informe está limitada solo a ciertos usuarios autorizados. Aún así, es un primer paso fácil que lo ayudará a comenzar. –

13

Sé que esta pregunta es tan antigua que tiene bigotes, pero el siguiente código enumerará cada informe una vez con la última vez que se ejecutó. Le recomiendo que cree una nueva carpeta llamada "informes obsoletos" y mueva los informes antiguos allí en lugar de eliminarlos. Eso eliminará el desorden pero aún los mantendrá disponibles en caso de que el Departamento de Contabilidad venga detrás de usted por ese informe que obviamente necesita ejecutar una vez cada 3.26 años.

WITH RankedReports 
AS 
(SELECT ReportID, 
     TimeStart, 
     UserName, 
     RANK() OVER (PARTITION BY ReportID ORDER BY TimeStart DESC) AS iRank 
    FROM dbo.ExecutionLog t1 
     JOIN 
     dbo.Catalog t2 
      ON t1.ReportID = t2.ItemID 
) 
SELECT t2.Name AS ReportName, 
     t1.TimeStart, 
     t1.UserName, 
     t2.Path, 
     t1.ReportID 
    FROM RankedReports t1 
     JOIN 
     dbo.Catalog t2 
     ON t1.ReportID = t2.ItemID 
WHERE t1.iRank = 1 
ORDER BY t1.TimeStart; 
+0

He votado a favor de esto por referencia a los oscuros informes requeridos por el Departamento de Contabilidad ... ¡demasiadas veces me han avisado con menos de 24 horas de anticipación para volver a desarrollar algo de lo que nadie sabe nada! – Gallus

46

Hay algunos buenos consejos y consultas para generar informes sobre esto en la siguiente article.

Por ejemplo, si desea ver los informes más utilizados, se puede hacer lo siguiente:

SELECT COUNT(Name) AS ExecutionCount, 
     Name, 
     SUM(TimeDataRetrieval) AS TimeDataRetrievalSum, 
     SUM(TimeProcessing) AS TimeProcessingSum, 
     SUM(TimeRendering) AS TimeRenderingSum, 
     SUM(ByteCount) AS ByteCountSum, 
     SUM([RowCount]) AS RowCountSum 
    FROM (SELECT TimeStart, 
       Catalog.Type, 
       Catalog.Name, 
       TimeDataRetrieval, 
       TimeProcessing, 
       TimeRendering, 
       ByteCount, 
       [RowCount] 
      FROM Catalog 
       INNER JOIN 
       ExecutionLog 
       ON Catalog.ItemID = ExecutionLog.ReportID 
     WHERE Type = 2 
     ) AS RE 
GROUP BY Name 
ORDER BY COUNT(Name) DESC, 
     Name; 

Una cosa a tener en cuenta es que por defecto el registro de ejecución sólo mantendrá 2 meses el valor de los datos. Puede controlar este comportamiento con la propiedad del servidor ExecutionLogDaysKept, consulte this technet article.

0

Esta SQL también le dará la fuente de datos, el usuario y el tipo de solicitud:

select row_number() over (order by LogEntryId) as Id, LogEntryId, 
     r.Name AS Report_Name, r.Path AS Report_Path, c2.Name AS Data_Source, 
     replace(c2.ConnectString,';Unicode=True','') as ConnectString, 
     SUBSTRING(r.Path, 2, LEN(r.Path) - LEN(r.Name) - 2) AS Folder_Path, 
     ex.UserName, ex.Format, ex.TimeProcessing, ex.TimeRendering, ex.[RowCount], 
     CAST (ex.TimeStart as date) AS TimeStart, 
     DATEPART (hour, ex.TimeStart) AS StartHour, 
     DATEPART (minute, ex.TimeStart) AS StartMinute, 
     case 
      when ex.RequestType = 0 then 'Interactive' 
      when ex.RequestType = 1 then 'Subscription' 
      when ex.RequestType = 2 then 'Refresh Cache' 
     else 'Unknown' end RequestType, 
     u.UserName as CreatedBy, 
     ex.Status 
    from ExecutionLogStorage ex (nolock) --exec log 
     join Catalog (nolock) r on ex.ReportID = r.ItemID and r.Type = 2 --report 
     join DataSource ds with (nolock) ON ds.ItemID = r.ItemID --report to connection link 
     join (select ItemID, Name, SUBSTRING(Content, CHARINDEX('<ConnectString>',Content) + 15, CHARINDEX('</ConnectString>',Content) - CHARINDEX('<ConnectString>',Content) - 15) AS ConnectString 
       from (select ItemID, Name, CONVERT(NVARCHAR(MAX),CONVERT(XML,CONVERT(VARBINARY(MAX),Content))) As Content 
         from Catalog with (nolock) where Type = 5) x 
     ) c2 ON ds.Link = c2.ItemID -- connection 
     left join Users u on u.UserID = r.CreatedByID 
Cuestiones relacionadas