SSRS数据驱动的订阅 - 如何实施审计/日志记录

时间:2016-06-29 01:33:47

标签: reporting-services

我目前正在使用数据驱动的订阅实施一些SSRS报告(使用2014版)。

需要存储每次作业运行时报告发送到哪个电子邮件地址的信息,以及使用的参数。

虽然我可以获得一些有用的信息,例如从ReportServer.dbo.ExecutionLog2视图执行开始和结束时间,参数等,我在DB中找不到存储电子邮件地址元数据的任何地方。

任何人都可以想到我可以获得此信息并满足要求的方式吗?

提前致谢。

2 个答案:

答案 0 :(得分:0)

ExtensionSettings数据库中Subscriptions表中的ReportServer字段包含您要查找的信息。唯一的下降部分,全部是XML格式。但是,您可以从中提取电子邮件地址以及有关订阅的所有其他内容。下面是一个示例查询,我在查找或排除订阅时经常使用这个查询。

SELECT A.SubscriptionID, A.Report_OID, B.Name, [Path], 
A.LastRunTime, A.Description, C.UserName AS Owner, A.LastStatus, A.ExtensionSettings
FROM Subscriptions A INNER JOIN Catalog B
ON A.Report_OID = B.ItemID
INNER JOIN Users C
ON A.OwnerID = C.UserID
WHERE A.ExtensionSettings LIKE '%username@domain.com%'
ORDER BY A.LastRunTime DESC

警告,这适用于常规订阅...数据驱动的订阅在此字段中有一些数据,但不多,因为DDS的人员和内容可能因运行而异。

我对数据驱动订阅的建议是在您用来驱动订阅数据的查询中添加一些审核代码。如果查询尚未进行,请将其设置为存储过程,并在其中添加一些日志记录以捕获即将发生的事件。假设订阅交付成功。

如果您正在执行其中的一些操作(如您所述),可能需要构建一个日志记录/审核存储过程,您可以将信息传递给日志记录并进行日志记录。如果您在各种计算机上有数据源,则可以将日志记录集中在一台服务器上,并使用链接服务器来调用该过程。有些DBA可能会对此犹豫不决,但它会起作用。

答案 1 :(得分:0)

这是一篇很老的帖子,但我实施了类似于R.Richards'回答和约翰对R. Richards'的评论。回答。它的工作非常好,所以我想我会分享给遇到这个的人。

第1步:向报告中添加两个隐藏参数(ExecutionGUID和LogID)

ExecutionGUID :标识一个唯一的"批次"的记录。数据驱动查询中的每条记录都包含相同的值

LogID :从数据驱动的查询中标识报告的唯一呈现。数据驱动查询中的每条记录都将包含唯一值。

当报表运行时,参数值会记录在dbo.ExecutionLog3视图的Parameters列中,如下所示:

ExecutionGUID=1A3C55F1-0B14-46C1-AF5F-008A3617A0F3&LogID=141

可以解析这些内容以将此记录绑定到下面的日志表中。

第2步:将数据驱动的查询更改为过程

之前我有这样的问题作为查询:

select
    ToEmails
   ,CcEmails
   ,EmailSubject
   ,Param1
   ,Param2
from
    mytable

然后我创建了一个表:

CREATE TABLE [dbo].[DataDrivenSubscriptionLog](
    [LogID] [bigint] IDENTITY(1,1) NOT NULL,
    [LogDateTime] [datetime] NOT NULL,
    [ExecutionGUID] [varchar](36) NULL,
    [ToEmails] [varchar](250) NULL,
    [CcEmails] [nvarchar](500) NULL,
    [EmailSubject] [nvarchar](4000) NULL,
    [Param1] [varchar](250) NULL,
    [Param2] [varchar](250) NULL
)

并将我的程序改为:

CREATE PROCEDURE dbo.GetDataDrivenDataSet
AS 
BEGIN
    declare @ExecutionGUID varchar(36)

    set @ExecutionGUID = NEWID()

    insert into dbo.DataDrivenSubscriptionLog
    select
        GETDATE() as LogDateTime
        ,@ExecutionGUID as ExecutionGUID
        ,ToEmails
        ,CcEmails
        ,EmailSubject
        ,Param1
        ,Param2
    from
        mytable

    select
        *
    from
        dbo.DataDrivenSubscriptionLog
    where
        ExecutionGUID = @ExecutionGUID

END

步骤3:更新数据驱动的订阅以使用proc并映射隐藏的列

这是所有人联系在一起的地方。订阅将运行该过程,该过程将记录添加到日志中并从日志中返回该批次中的值。然后将此结果集映射到电子邮件信息和参数,包括ExecutionGUID和LogID的隐藏参数。

订阅运行后,日志表和ExecutionLog3视图可以连接在一起。您将能够知道哪些记录应该运行但没有运行,哪些记录确实运行,以及报告发送给谁。