繁体   English   中英

如何通过sql服务器触发器运行报表服务器订阅,而不会潜在地“阻碍”订阅表?

[英]How to run a report server subscription through sql server trigger without potential “bottlenecking” the subscription table?

我们正在使用SSRS报告来查看数据。 我们有与基于SQL触发器的报告相关联的订阅。 此触发器将更新订阅表,并动态更改将电子邮件发送给谁的参数。 但是,如果触发器在彼此之间的4秒钟内执行两次,那么最后一个电子邮件接收者会收到第一个订阅的报告和第二个订阅的报告,那么这样做会很好。

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

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

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

有没有一种方法可以使用sql脚本创建订阅,并将参数传递给Report Server用于创建新订阅或计划订阅的存储过程?

我的代码粘贴在下面,该代码显示表(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

看起来好像是一回合,但是它将避免瓶颈和并发问题:

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

而是将触发器INSERT插入队列表,其中包含更新订阅表所需的所有信息。

有一项需要您经常执行的工作,该工作从队列中的记录更新预订表,然后将这些记录标记为已完成,因此不会一次又一次地完成。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM