从 SQL Server 2016 SP1 中的 QueryStore 获取报表服务器查询
Get Report Server queries from QueryStore in SQL Server 2016 SP1
我有一个数据库,其中包含多个我想删除的很少使用的冗余 table。
但是,如果我的报告服务器用户名访问了 table,我想将 table 留在原处,直到我可以修改该报告。
我如何判断特定用户名是否已从 table 读取,是否可以记录他们会话的所有详细信息并查询到 table,尤其是确切时间他们的查询?
我在数据库上启用了查询存储,并且已经打开了几个星期。
我真正想要的是导致这些 table 被访问的报告名称 运行,这样我就可以将它们指向较新的 table 和删除这些旧的。
我想我可以做到这一点,如果我能得到我的报告服务器登录访问 table 的准确时间戳,然后我可以将它与报告 运行 的时间相匹配让我知道哪些报告访问某些 tables.
或者也许有一种方法可以实际将 SSRS tables 连接到会话 ID 上的查询存储区 tables,我可以 运行 一个查询来查找我的报表服务器用户名和特定的 tables?
希望这是有道理的?
编辑 - 感谢下面的用户 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!%'
perhaps there's a way to actually join the SSRS tables to the querystore tables on session id, and I could just run a query looking for my report server username and particular tables?
我不认为,有可能与报表服务维护的 SSRS 中的会话详细信息有直接关系,其中查询存储会话详细信息由 SQL 引擎维护。
但是,由于您已经有用户在 Report Server 数据库 select * from ExecutionLog2
中报告执行日志,通过以下查询您可以识别用于报告的 tables/views:
;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
我有一个数据库,其中包含多个我想删除的很少使用的冗余 table。
但是,如果我的报告服务器用户名访问了 table,我想将 table 留在原处,直到我可以修改该报告。
我如何判断特定用户名是否已从 table 读取,是否可以记录他们会话的所有详细信息并查询到 table,尤其是确切时间他们的查询?
我在数据库上启用了查询存储,并且已经打开了几个星期。
我真正想要的是导致这些 table 被访问的报告名称 运行,这样我就可以将它们指向较新的 table 和删除这些旧的。
我想我可以做到这一点,如果我能得到我的报告服务器登录访问 table 的准确时间戳,然后我可以将它与报告 运行 的时间相匹配让我知道哪些报告访问某些 tables.
或者也许有一种方法可以实际将 SSRS tables 连接到会话 ID 上的查询存储区 tables,我可以 运行 一个查询来查找我的报表服务器用户名和特定的 tables?
希望这是有道理的?
编辑 - 感谢下面的用户 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!%'
perhaps there's a way to actually join the SSRS tables to the querystore tables on session id, and I could just run a query looking for my report server username and particular tables?
我不认为,有可能与报表服务维护的 SSRS 中的会话详细信息有直接关系,其中查询存储会话详细信息由 SQL 引擎维护。
但是,由于您已经有用户在 Report Server 数据库 select * from ExecutionLog2
中报告执行日志,通过以下查询您可以识别用于报告的 tables/views:
;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