我有一个数据库,其中包含多个我想删除的很少使用的冗余表。
但是,如果我的报表服务器用户名完全访问表,我想将表留在原处,直到我可以修改该报表。
如何判断特定用户名是否已从表中读取,是否可以记录其会话的所有详细信息并查询到表中,尤其是查询的确切时间?
我在数据库上激活了查询存储,它已经打开了几个星期。
我真正想要的是导致这些表被访问的正在运行的报告的名称,因此我可以将它们指向较新的表并删除这些旧表。
我想如果我能获得报告服务器登录访问表时的准确时间戳,我就可以做到这一点,然后我可以将其与运行报告的时间相匹配,让我知道哪些报告访问某些表。
或者也许有一种方法可以将 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!%'