0

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

但是,如果我的报表服务器用户名完全访问表,我想将表留在原处,直到我可以修改该报表。

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

我在数据库上激活了查询存储,它已经打开了几个星期。

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

我想如果我能获得报告服务器登录访问表时的准确时间戳,我就可以做到这一点,然后我可以将其与运行报告的时间相匹配,让我知道哪些报告访问某些表。

或者也许有一种方法可以将 SSRS 表实际连接到 session id 上的查询存储表,我可以运行一个查询来查找我的报表服务器用户名和特定表?

希望这有意义吗?

编辑 - 感谢下面的用户 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!%'
4

1 回答 1

1

也许有一种方法可以将 SSRS 表实际连接到 session id 上的查询存储表,我可以运行一个查询来查找我的报表服务器用户名和特定表?

我不认为,与报表服务维护的 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

这是ExecutionLog2(数据库的内置视图ReportServer)的定义,您可以根据需要自由添加额外的列(保存为不同的视图不要替换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
于 2019-08-10T19:34:16.167 回答