如何获取审计表最新记录并通过SSRS发送不重复邮件通知
解决SSRS邮件重复发送审计记录的问题
针对你遇到的重复发送旧记录的问题,优先通过调整SQL+新增追踪机制解决,SSRS配置调整仅作为临时方案,具体如下:
方案一:SQL层面控制(推荐,彻底解决重复问题)
SQL Server 2008 R2的SSRS快照/订阅没有内置的"已推送标记"功能,所以从数据源头控制推送范围是最可靠的方式:
新增推送追踪表
在数据库中创建一张CUSTOMER_Audit_Pushed表,用于记录已推送的审计记录:CREATE TABLE CUSTOMER_Audit_Pushed ( PushID INT IDENTITY(1,1) PRIMARY KEY, AuditRecordID INT NOT NULL, -- 关联CUSTOMER_Audit表的主键 PushDateTime DATETIME DEFAULT GETDATE(), CONSTRAINT FK_Audit_Pushed FOREIGN KEY (AuditRecordID) REFERENCES CUSTOMER_Audit(AuditID) )修改查询语句
调整原查询,只筛选未被标记为已推送、且符合条件的记录:SELECT ca.* FROM CUSTOMER_Audit ca LEFT JOIN CUSTOMER_Audit_Pushed cap ON ca.AuditID = cap.AuditRecordID WHERE cap.AuditRecordID IS NULL AND (ca.BUS_TYPE <> ca.OLD_BUS_TYPE OR ca.RECORD_STATUS = 'DELETED') -- 替换为你判断变更/删除的逻辑 AND ca.AuditDateTime >= DATEADD(day, -30, GETDATE())标记已推送记录
配置SSRS的数据驱动订阅(SQL Server 2008 R2支持),在邮件发送完成后,通过SQL语句将本次推送的记录ID插入到CUSTOMER_Audit_Pushed表中。如果用快照订阅,也可以在快照生成后,通过SQL Agent作业执行插入操作,确保下次查询不会再选中这些记录。
方案二:SSRS配置调整(临时 workaround,局限性大)
如果不想修改数据库,可尝试通过SSRS参数和订阅设置限制推送范围,但维护成本高:
- 给报表添加一个
@LastPushTime参数,默认值设为上次订阅的时间,查询时只筛选AuditDateTime > @LastPushTime的记录。但SQL Server 2008 R2的SSRS无法自动更新这个参数值,需要借助自定义代码或外部脚本定期更新,容易出错。 - 放弃静态快照,改用"订阅时生成快照",但SharePoint集成的SSRS 2008 R2对快照的时间范围控制不够精准,仍可能出现重复推送。
总结
优先选择SQL层面的追踪方案,从数据源头确保只推送未发送过的记录,彻底解决重复问题。SSRS配置调整仅适合临时场景,长期来看维护复杂,可靠性低。
内容的提问来源于stack exchange,提问作者PrettyCode
相关产品推荐
相关产品推荐

