如何通过sql server触发器运行报表服务器订阅而没有潜在的“瓶颈”订阅表?

时间:2015-12-04 20:49:40

标签: sql-server reporting-services

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

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

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

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

是否有办法使用sql脚本创建订阅并将参数传递给Report的Store Procedures 服务器用于创建新订阅或预定订阅?

我的代码粘贴在下面,表示一旦表中的值(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

1 个答案:

答案 0 :(得分:0)

它可能看起来像是一种回合,但它可以避免瓶颈和并发问题:

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

相反,将触发器INSERT放入队列表中,并提供更新订阅表所需的任何信息。

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

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

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