字段修改时自动邮件通知:跟踪表中免税状态变更及操作人
实现方案
完全可以实现,结合你现有的查询基础,有两种可落地的路径,优先推荐第一种:
方案1:数据库触发器+审计表+内置邮件推送(实时无遗漏)
这个方案直接在数据库层捕获变更,不会因为应用层逻辑绕过导致漏记:
- 第一步先创建独立的变更审计表,专门存
Tax Exempt status(对应你表中的job_taxable_indicator字段)的修改记录,表结构参考:
CREATE TABLE JOB_TAX_STATUS_CHANGE_AUDIT ( AUDIT_ID BIGINT IDENTITY(1,1) PRIMARY KEY, JOB_JOB_ID BIGINT NOT NULL, OLD_TAXABLE_INDICATOR VARCHAR(50), NEW_TAXABLE_INDICATOR VARCHAR(50) NOT NULL, OPERATOR_USER_ID VARCHAR(50) NOT NULL, OPERATOR_USER_NAME VARCHAR(100) NOT NULL, CHANGE_TIME DATETIME NOT NULL DEFAULT GETDATE(), OPERATE_IP VARCHAR(50) );
- 第二步创建更新触发器,仅当
job_taxable_indicator字段发生变更时触发,自动写入审计记录同时触发邮件发送:
-- 不同数据库语法略有差异,以下为通用逻辑示例 CREATE TRIGGER TRG_TAX_STATUS_CHANGE ON BI50_JOB_COST_V1 AFTER UPDATE AS BEGIN -- 仅当免税状态字段变更时执行逻辑 IF UPDATE(job_taxable_indicator) BEGIN -- 写入审计表 INSERT INTO JOB_TAX_STATUS_CHANGE_AUDIT ( JOB_JOB_ID, OLD_TAXABLE_INDICATOR, NEW_TAXABLE_INDICATOR, OPERATOR_USER_ID, OPERATOR_USER_NAME, CHANGE_TIME ) SELECT d.JOB_JOB_ID, d.job_taxable_indicator AS OLD_TAXABLE_INDICATOR, i.job_taxable_indicator AS NEW_TAXABLE_INDICATOR, i.SEC_USER_ID, i.SEC_USER_NAME, i.act_CREATION_DATE FROM deleted d JOIN inserted i ON d.JOB_JOB_ID = i.JOB_JOB_ID WHERE d.job_taxable_indicator <> i.job_taxable_indicator; -- 调用数据库内置邮件存储过程,把上述变更内容拼接为邮件正文,发送给指定告警接收人 -- 不同数据库邮件存储过程不同,SQL Server用sp_send_dbmail,MySQL用自定义UDF调用邮件接口即可 END END
方案2:定时轮询比对(适合无数据库高权限场景)
如果你没有建触发器、配置数据库邮件的权限,可以基于你现有的SELECT语句改造实现:
- 先创建一张快照表,存当前所有作业的最新
job_taxable_indicator值、对应操作人、更新时间作为比对基线 - 配置定时任务(比如每5分钟执行一次),跑你写的查询逻辑拉取最新数据,和快照表做关联比对:
- 筛选出同一个
JOB_JOB_ID下job_taxable_indicator值和快照不一致的记录,即为发生变更的条目 - 提取变更前后值、操作人ID、操作人姓名、变更时间,调用内部邮件接口发送通知
- 执行完成后把最新数据更新到快照表,作为下一轮比对的基线
- 筛选出同一个
- 注意你当前写的SQL加了
DISTINCT可能会丢失短时间内重复修改的记录,正式使用时要去掉,保留全量变更轨迹
方案注意点
- 触发器方案实时性最高,没有捕获延迟,也不会漏记绕过应用层的数据库直连修改,优先选择
- 轮询方案存在轮询间隔的告警延迟,如果两次轮询之间字段被修改后又改回原值,会无法捕获该次操作
- 邮件通知需要明确标注变更作业ID、新旧状态值、操作人信息、精确操作时间,方便后续核对追责
内容的提问来源于stack exchange,提问作者Alyssa
相关产品推荐
相关产品推荐

