获取添加到审核表的最新记录并发送电子邮件

Get the latest record added to an audit table and send email

提问人:PrettyCode 提问时间:11/3/2023 最后编辑:Dale KPrettyCode 更新时间:11/3/2023 访问量:68

问:

我正在尝试获取添加到审核表的最新记录,并向组织中的一些人发送一封电子邮件,其中包含添加的记录的详细信息,但不确定如何执行此操作。

我正在使用 Sharepoint SSRS 报表通过以下查询显示数据 -

-- for records which have updated BUSTYPE
SELECT UPPER(caa.Comments) + ' Record' 'SQLAction'
    , c.BUS_TYPE AS CurrentBusType
    , caa.BUS_TYPE AS PrevBusType
    , caa.LastModified
    , c.CUSTOMERID
    , c.NAME
    , c.ADDRESS1
    , c.ADDRESS2
    , c.CITY
    , c.STATE
    , c.ZIP, 
FROM CUSTOMER_Audit AS caa
INNER JOIN CUSTOMER AS c ON caa.CUSTOMERID = c.CUSTOMERID 
where ISNULL(caa.BUS_TYPE,'') != ISNULL(c.BUS_TYPE,'')
AND (ISNULL(caa.BUS_TYPE,'') = '' OR ISNULL(c.BUS_TYPE,'') = '')
AND ISNULL(c.BUS_TYPE,'') = ''
AND DATEDIFF(dd, CONVERT(date, caa.LastModified), GETDATE()) <= 30 -- last 30 days filter

UNION

-- for records which are deleted
SELECT UPPER(caa.Comments) + ' Record' 'SQLAction'
    ,'' AS CurrentBusType
    , caa.BUS_TYPE AS PrevBusType
    , caa.LastModified
    , caa.CUSTOMERID
    , caa.NAME
    , caa.ADDRESS1
    , caa.ADDRESS2
    , caa.CITY
    , caa.STATE
    , caa.ZIP 
FROM CUSTOMER_Audit AS caa
WHERE caa.Comments LIKE '%Deleted%'
AND DATEDIFF(dd, CONVERT(date, caa.LastModified), GETDATE()) <= 30
ORDER BY caa.LastModified DESC

如何仅为在发送带有某些记录的上一封电子邮件后添加的最后一条记录发送电子邮件。

新电子邮件不应发送已在上一封电子邮件中发送的更新/删除的记录。

我尝试在 Sharepoint 中使用快照,但它正在发送所有快照,其中包含已发送的相同记录(以及新记录(如果有的话)。不知道我是否在那里做错了什么。

或者,我是否应该将 SQL 查询调整为仅显示最新记录?但是我该怎么做呢?

我的 SQL Server 是 2008 R2。

SQL-SERVER T-SQL SHAREPOINT 报告服务

评论

1赞 Dale K 11/3/2023
您通常需要标记/跟踪已通知的记录,或存储上次处理的记录的 if。
0赞 PrettyCode 11/3/2023
@DaleK 我不想只为此报告添加新列(用于标志)
0赞 Dale K 11/3/2023
您需要以某种方式确定您已经通知了哪些记录。
0赞 PrettyCode 11/3/2023
没错,但这就是我试图弄清楚的 - 除了添加新列(标志)之外的任何想法
1赞 Dale K 11/3/2023
顺便说一句,您的 SQL Server 版本已经过时了。您需要计划尽快升级。

答:

2赞 Dale K 11/3/2023 #1

一个非常简单的解决方案是创建一个表格,该表格记录了报表上显示的最后一条记录,例如

CREATE TABLE dbo.ReportHistory (
    -- Following is a way to identify the report, could be plain text
    -- Could be the ID of the report in SSRS
  Report varchar(128)
  , LastIdQueried bigint
)

然后,每次运行报表时,都会更新此表。并且假设您通过存储过程提取结果。

但是,这是有问题的,因为如果从 SSRS 手动运行报表,而不通过电子邮件发送结果,则不会收到有关结果的通知。

因此,在这种情况下,我倾向于创建自己的快照,在我选择的时间触发代理作业,然后显示此静态快照中的数据。我对此快照(简化)的架构是:

CREATE TABLE dbo.ReportInstance (
    Id bigint NOT NULL IDENTITY (1,1) PRIMARY KEY CLUSTERED,
    DateOfReportRun datetime2(0) NULL,
    -- Following is a way to identify the report, could be plain text
    -- Could be the ID of the report in SSRS
    Report varchar(128) NULL
);

CREATE TABLE dbo.ReportInstanceItem (
    Id bigint NOT NULL IDENTITY (1,1) NOT NULL PRIMARY KEY CLUSTERED,
    ReportInstance bigint NULL REFERENCES dbo.ReportInstance(Id),
    -- Store the ids from the target table which are part of this report
    RecordId bigint NULL
);

评论

0赞 PrettyCode 11/3/2023
您的解决方案似乎非常令人印象深刻。再问几个问题。当存储的 proc 与报表服务器 db 位于不同的服务器 db 上时,如何从存储的 proc 在 reportHistory 中插入数据?在第二种解决方案中,您的意思是我必须在实际数据库服务器上创建一个 sql 代理作业并在 ReportInstance 和 ReportInstanceItem 中插入值?
0赞 Dale K 11/3/2023
1) 无论选择存储数据,您都将其存储在实际数据库中,而不是 SSRS 数据库中。2) 更正您正在构建自己的报表快照,同样是在您自己的数据库中,而不是 SSRS。