【问题标题】:Tracking report usage跟踪报告使用情况
【发布时间】:2010-11-13 19:48:46
【问题描述】:

是否有一种简单的方法可以跟踪谁在 SSRS 2005 中运行给定报告,以及他们在什么时间运行该报告?在我们的 SSRS 实施中,我们有大约 80 份报告,并且正在尝试看看是否有任何我们可以安全地放牧的报告。如果我们能够以某种方式轻松查看哪些报告没有被使用,那将对我们有所帮助。有什么想法吗?

【问题讨论】:

    标签: reporting-services reportingservices-2005


    【解决方案1】:
    USE ReportServer
    SELECT c.Name AS ItemName
        ,  CASE c.Type
            WHEN 1 THEN 'Folder'
            WHEN 2 THEN 'Report'
            WHEN 3 THEN 'Resource'
            WHEN 4 THEN 'Linked Report'
            WHEN 5 THEN 'Data Source'
            ELSE CAST(c.Type AS VARCHAR(100))
            END AS ItemType
        ,  c.Path AS ItemPath
        ,  ( SELECT TOP 1 TimeStart FROM dbo.ExecutionLog t1 WHERE t1.ReportID = c.ItemID ORDER BY TimeStart DESC ) AS LastRunDate
        ,  ( SELECT TOP 1 UserName FROM dbo.ExecutionLog t1 WHERE t1.ReportID = c.ItemID ORDER BY TimeStart DESC ) AS LastUser
     FROM Catalog AS c WITH (NOLOCK)
     WHERE 1=1
        --AND c.Type IN (1,2)
    

    --如果只搜索报告和文件夹,请取消注释

    【讨论】:

      【解决方案2】:

      在下面的article 中有一些关于生成报告的好建议和查询。

      例如,如果您想查看最常用的报告,您可以执行以下操作:

      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;
      

      需要注意的一点是,默认情况下,执行日志只会保留 2 个月的数据。您可以使用ExecutionLogDaysKept 服务器属性控制此行为,请参阅this technet article

      【讨论】:

      • 我认为您与 wrox 的链接已损坏。我试图找到它,但失败了。
      • 看起来那样。不知道他们是否重新组织了那里的论坛,这就是为什么我在答案中放了一个示例。
      • 更新了 wrox 链接到 2017 年页面的存档版本
      • @FistOfFury - 太棒了,我怎么没想到?
      【解决方案3】:

      此 SQL 还将为您提供数据源、用户和请求类型:

      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
      

      【讨论】:

        【解决方案4】:

        我知道这个问题太老了,它有胡须,但下面的代码将列出每个报告一次,以及它最后一次运行的时间。我强烈建议您创建一个名为“过时报告”的新文件夹并将旧报告移到那里而不是删除它们。这将消除混乱,但仍然可以让它们保持可用,以防会计部门跟踪您的报告,他们显然需要每 3.26 年运行一次。

        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;
        

        【讨论】:

        • 我赞成这个纯粹是为了参考会计部门要求的晦涩报告......太多次我收到不到 24 小时的通知来重新开发没人知道的东西!跨度>
        • @Russell Fox 据我所知,执行日志不会跟踪从父报告调用的任何子报告。如果这是真的,我可能最终也会废弃子报告。关于如何从查询中排除活动子报告的任何想法?
        • @Bonzay - 这很难,但我只是通过相应地命名报告来处理它:MainReportName_Sub_WhatTheSubDoes。在名称中对报告进行编号也有帮助,并且可以更轻松地按报告编号进行搜索:“DailyFinance9427_Sub_QtrTotal”。然后你可以 WHERE t1.iRank = 1 AND ReportName NOT LIKE '%_Sub_%'
        【解决方案5】:

        我总是发现报告日志有点难用。报告服务将其所有活动记录在报告数据库中名为 ExecutionLog

        的表中

        我有几个报告用于查询此表,因此您可以了解实际使用的报告以及最重的用户是谁

        【讨论】:

        • 这对于简单而轻松的报告很有用,但您仅限于服务器存储的历史记录(我相信 3 个月),并且报告数据库的安全性仅限于某些授权用户。仍然 - 这是一个简单的第一步,可以让你开始。
        【解决方案6】:

        您可以使用执行日志监控报告使用情况。请检查此http://technet.microsoft.com/en-us/library/aa964131(SQL.90).aspx

        您还可以运行查询来查找报告使用情况。在此链接中查看 Maz 的回复http://www.sqlservercentral.com/Forums/Topic433562-150-1.aspx

        干杯

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-03-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多