【问题标题】:How to run a report server subscription through sql server trigger without potential "bottlenecking" the subscription table?如何通过 sql server 触发器运行报表服务器订阅,而不会潜在地“瓶颈”订阅表?
【发布时间】:2015-12-04 20:49:40
【问题描述】:

我们正在使用 SSRS 报告来查看数据。我们有与基于 SQL 的报告相关联的订阅 扳机。此触发器更新订阅表并动态更改订阅者的参数 电子邮件正在发送到。但是,如果触发器在一次的 4 秒内执行两次,这可以正常工作 然后最后一个电子邮件收件人收到第一个订阅的报告和第二个。

问题是,两个不同的电子邮件收件人如何获得自己的订阅报告 如果触发器在 4 秒内执行了两次?

4 秒后,第一个收件人收到他的电子邮件,第二个收件人收到他的电子邮件,一切都很好。

似乎存在一个瓶颈,多个用户可能会更新订阅表中的一行,这可能会导致潜在问题。

有没有办法使用 sql 脚本创建订阅并将参数传递给报告的存储过程 服务器用于创建新订阅或预定订阅?

我的代码粘贴在下面,显示一旦表中的值(EmployeeTimeSheets)被更新,触发器就会执行,将插入的 订阅参数部分的 ID(员工)。

有没有办法在 sql server 中动态构建报表服务器订阅? 非常感谢任何帮助。

declare @WkEnd nvarchar(30);
declare @Employee nvarchar(50);
declare @UserName nvarchar(30);
declare @TimeStamp datetime;
declare @Title nvarchar(30);
declare @CompleteTS nvarchar(15);


                                    /* If no email is sent to the email afer testing this trigger then that means its past 2pm on Monday.*/
IF (UPDATE(SelfReport))
    BEGIN



                set @WkEnd=(Select distinct i.[WkEnd] FROM  inserted i INNER JOIN deleted AS d ON i.EmpId = d.EmpId)
                set @Employee=(Select distinct e.[Employee] FROM  inserted i inner join deleted d on i.empid=d.empid inner join employees e on i.empid=e.rowid)
                set @UserName=(Select distinct e.[UserName] FROM  inserted i inner join deleted d on i.empid=d.empid inner join employees e on i.empid=e.rowid)
                set @Title=(Select distinct e.[Title] FROM  inserted i inner join deleted d on i.empid=d.empid inner join employees e on i.empid=e.rowid)



                update ReportServer.dbo.Subscriptions
                    set [Parameters]='<ParameterValues>
                                            <ParameterValue><Name>WeekEnding</Name><Value>'+@WkEnd+'</Value></ParameterValue>
                                            <ParameterValue><Name>SelecDepartment</Name><Value>'+@Title+'</Value></ParameterValue>
                                            <ParameterValue><Name>SelectEmployee</Name><Value>'+@Employee+'</Value></ParameterValue></ParameterValues>',





                     [ExtensionSettings]= '<ParameterValues>
                                                <ParameterValue><Name>TO</Name><Value>'+@UserName+'@processsolutions.com</Value></ParameterValue>
                                                <ParameterValue><Name>IncludeReport</Name><Value>True</Value></ParameterValue>
                                                <ParameterValue><Name>RenderFormat</Name><Value>PDF</Value></ParameterValue>
                                                <ParameterValue><Name>Subject</Name><Value>Completed TimeSheet From '+@Employee+'</Value></ParameterValue>
                                                <ParameterValue><Name>IncludeLink</Name><Value>False</Value></ParameterValue>
                                                <ParameterValue><Name>Priority</Name><Value>NORMAL</Value></ParameterValue>
                                                <ParameterValue><Name>Comment</Name><Value>TimeSheet Completion: ' +@Employee+ ' ' +@WkEnd+ '</Value></ParameterValue>
                                           </ParameterValues>'  

                    where SubscriptionID='530f3da4-a6b5-4594-aa6b-3bfd638600d3'

                EXEC ReportServer.dbo.AddEvent @EventType='TimedSubscription', 
                                               @EventData='530f3da4-a6b5-4594-aa6b-3bfd638600d3'

END

【问题讨论】:

    标签: sql-server reporting-services


    【解决方案1】:

    这可能看起来有点绕,但它会避免瓶颈和并发问题:

    不要让您的触发器直接更新订阅表。

    相反,将触发器插入到队列表中,其中包含更新订阅表所需的任何信息。

    有一个作业可以根据需要经常运行,它根据队列中的记录更新订阅表,然后将这些记录标记为已完成,因此它们不会一次又一次地完成。

    这避免了并发和瓶颈,因为如果作业当前正在运行,它就无法启动,因此您不能让作业的两个实例同时尝试更新订阅表,就像使用触发器一样.

    当然,另一种解决方案是培训创建订阅的人员正确执行此操作,而无需触发器来帮助他们填写参数值。这就是我们在这里所做的。 :)

    【讨论】:

      猜你喜欢
      • 2011-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-11
      • 1970-01-01
      相关资源
      最近更新 更多