我有一个数据库,其中包含多个要删除的很少使用的冗余表。
但是,如果我的报表服务器用户名完全访问了该表,那么我想保留该表,直到可以修改该报表为止。
我如何判断特定的用户名是否已从表中读取,是否可以记录其会话的所有详细信息并查询到表中,尤其是查询的确切时间?
我在数据库上激活了查询存储,并且已将其打开了几个星期。
我真正想要的是正在运行的报告的名称,这些名称导致访问这些表,因此我可以将它们指向较新的表并删除这些旧的表。
我认为,如果我可以获得有关报表服务器登录名访问表的准确时间戳,则可以将其与运行报表的时间进行匹配,以使我知道哪些报表可以访问某些表。
或者,也许有一种方法可以将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
这是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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句