从SQL Server 2016 SP1中的QueryStore获取报表服务器查询

杰夫·格里斯瓦尔德

我有一个数据库,其中包含多个要删除的很少使用的冗余表。

但是,如果我的报表服务器用户名完全访问了该表,那么我想保留该表,直到可以修改该报表为止。

我如何判断特定的用户名是否已从表中读取,是否可以记录其会话的所有详细信息并查询到表中,尤其是查询的确切时间?

我在数据库上激活了查询存储,并且已将其打开了几个星期。

我真正想要的是正在运行的报告的名称,这些名称导致访问这些表,因此我可以将它们指向较新的表并删除这些旧的表。

我认为,如果我可以获得有关报表服务器登录名访问表的准确时间戳,则可以将其与运行报表的时间进行匹配,以使我知道哪些报表可以访问某些表。

或者,也许有一种方法可以将SSRS表实际上连接到会话ID上的querystore表中,而我可以运行查询以查找报表服务器用户名和特定表?

希望这有意义吗?

编辑-由于下面的用户Shekar Cola,我来到了以下解决方案,您可以使用该解决方案查询“ ReportServer”数据库并搜索该数据库上所有报告的SQL:

  WITH XMLNAMESPACES(DEFAULT'http://schemas.microsoft.com/sqlserver/reporting/2016/01/reportdefinition')
SELECT c.ItemID as ReportID,
       c.Name as ReportName,
       c.path as ReportPath,
       CAST(CONVERT( xml, CONVERT(varbinary(MAX), Content)) AS varchar(MAX)) as ReportContent,
       CONVERT( xml, CONVERT(varbinary(MAX), Content) ).value('(/Report/DataSets/DataSet/Query/CommandText/text())[1]','varchar(1000)') as ReportQuery
  INTO #RSTemp
  FROM [dbo].[Catalog] c
 WHERE Content IS NOT NULL AND type =2
    GO

SELECT * 
  FROM #RSTemp
 WHERE ReportContent LIKE '%Any SQL command, table name or comment I want to search for!%'
谢卡·科拉

也许有一种方法可以将SSRS表实际上连接到会话ID上的querystore表中,而我可以运行查询以查找报表服务器用户名和特定表?

我认为,由于报表服务维护的SSRS中的会话详细信息具有直接关系,其中SQL引擎维护的查询存储会话详细信息。

但是,由于您已经在Report Server数据库中拥有用户报表执行日志select * from ExecutionLog2,通过以下查询,您可以标识用于报表的表/视图:

;WITH XMLNAMESPACES(DEFAULT 'http://schemas.microsoft.com/sqlserver/reporting/2016/01/reportdefinition')

select  c.ItemID as ReportID,
        c.Name as ReportName,
        c.path as ReportPath,
        --convert( xml, CONVERT(varbinary(max), Content) ) as ReportContent,
        convert( xml, CONVERT(varbinary(max), Content) ).value('(/Report/DataSets/DataSet/Query/CommandText/text())[1]','varchar(1000)') as ReportQuery
from [dbo].[Catalog] c
where Content is not null and type =2
go

这是ExecutionLog2ReportServer数据库的内置视图的定义,您可以根据需要随意添加其他列(另存为其他视图,请不要替换ExecutionLog2

SELECT 
    c.ItemID as ReportID, ---- Additional Column added
    InstanceName, 
    COALESCE(C.Path, 'Unknown') AS ReportPath, 
    UserName,
    ExecutionId, 
    CASE(RequestType)
        WHEN 0 THEN 'Interactive'
        WHEN 1 THEN 'Subscription'
        ELSE 'Unknown'
        END AS RequestType, 
    -- SubscriptionId, 
    Format, 
    Parameters, 
    CASE(ReportAction)      
        WHEN 1 THEN 'Render'
        WHEN 2 THEN 'BookmarkNavigation'
        WHEN 3 THEN 'DocumentMapNavigation'
        WHEN 4 THEN 'DrillThrough'
        WHEN 5 THEN 'FindString'
        WHEN 6 THEN 'GetDocumentMap'
        WHEN 7 THEN 'Toggle'
        WHEN 8 THEN 'Sort'
        ELSE 'Unknown'
        END AS ReportAction,
    TimeStart, 
    TimeEnd, 
    TimeDataRetrieval, 
    TimeProcessing, 
    TimeRendering,
    CASE(Source)
        WHEN 1 THEN 'Live'
        WHEN 2 THEN 'Cache'
        WHEN 3 THEN 'Snapshot' 
        WHEN 4 THEN 'History'
        WHEN 5 THEN 'AdHoc'
        WHEN 6 THEN 'Session'
        WHEN 7 THEN 'Rdce'
        ELSE 'Unknown'
        END AS Source,
    Status,
    ByteCount,
    [RowCount],
    AdditionalInfo
FROM ExecutionLogStorage EL WITH(NOLOCK)
LEFT OUTER JOIN Catalog C WITH(NOLOCK) ON (EL.ReportID = C.ItemID)
GO

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章