使用EasySQLMAIL定时查询并发送数据表中的新记录
公司运维系统有一个告警信息表(表名为WARN_LOG)。为了能够及时获知告警信息,运维部门要求在有新的告警信息产生时将告警内容发送到维护部的值班邮箱中,以便及时处理。系统应每分钟读取一次新告警信息,一个告警只发送一次。
根据需求内容,我们打算按如下方式来进行配置:
(1)在数据源上创建一个中间表。每隔一分钟在告警信息表(WARN_LOG)上运行一次查询新数据SQL语句,并将要发送的新数据插入中间表。然后任务判断中间表是否有待发数据,如果有,则进行发送,否则中止任务。
(2)在任务成功执行后,将中间表中的记录状态修改为“已发送”,以防止重复发送。
(1)在数据源上创建一个中间表,用来存放已查询到的尚未发送的新数据:
--创建中间表,用于存放需要发送的未发送数据
CREATE TABLE t_data1
(
msg_id bigint,
create_time datetime,
msg varchar(2000),
state char(1) /*发送状态。A:未发送;C:已发送;*/
);
(2)创建任务,在任务中设置一个“SQL命令”,用于将未发送的数据插入到第一步创建的中间表中,新记录插入中间表时的记录的状态为A(未发送)。注意“执行时机”要选择“任务开始前执行”,并勾选“作为任务执行的先决条件”选项。
SQL命令中的SQL语句如下:
/*查询未发送过的新记录,并将新记录插入到中间表t_data1中*/
INSERT INTO t_data1(msg_id,create_time,msg,state)
SELECT
a.msg_id,
a.create_time,
a.msg,
'A' /*默认状态为A(未发送)*/
FROM
WARN_LOG a
WHERE
/*只查询未添加过的记录*/
NOT EXISTS(
SELECT 1
FROM t_data1
WHERE msg_id = a.msg_id);
COMMIT;
/*判断是否有待发记录,如果有,则继续执行任务,否则中止任务*/
SELECT 1 FROM t_data1 WHERE state = 'A';
(3)配置任务的正文模板、附件模板、收件人、执行计划等信息。在设置邮件附件的SQL语句时,注意要从前面创建的中间表中读取状态为A(未发送)的记录,SQL语句如下:
SELECT * FROM t_data1 WHERE state= 'A';
正文设置
附件设置
执行计划配置
(4)在任务中添加一个SQL命令,执行时机为“任务成功结束后执行”,用于在任务执行完后将已发记录的状态修改为C(已发送),以防止重复发送告警记录。SQL语句如下:
/*任务执行成功后,将t_test1中的记录的状态修改为C,以防止重复发送*/
UPDATE t_data1 SET state = 'C' WHERE state = 'A';
/*最后一定要提交一次,以防止因数据未提交造成重复发送*/
COMMIT;
设置命令成功后的SQL命令