2022-09-29 05:40:37
SQL触发器被触发机制SQL触发器通过事件驱动机制激活,其核心流程如下:
BEFORE触发器:在数据变更前执行,可修改即将插入/更新的数据(如校验或格式化),或阻止非法操作。
AFTER触发器:在数据变更后执行,常用于日志记录、级联操作或后续流程触发。
行级触发(FOR EACH ROW):对受影响的每一行数据单独执行触发逻辑,可通过OLD(操作前数据)和NEW(操作后数据)访问状态。
语句级触发(FOR EACH STATEMENT):无论影响多少行,仅执行一次,适用于统计类操作。
用户发起DML操作 → 数据库解析并检查BEFORE触发器 → 执行BEFORE逻辑 → 执行原始操作 → 检查AFTER触发器 → 执行AFTER逻辑。
任何步骤失败均导致事务回滚,确保数据一致性。
SQL触发器在自动响应中的核心功能与优势
核心功能
超越标准约束(如主键、外键),实现复杂校验。例如:
BEFORE UPDATE触发器检查订单金额是否超过客户信用额度,超限则阻止操作。
AFTER INSERT触发器根据新订单状态自动更新库存数量。
AFTER触发器捕获数据变更痕迹,记录操作者、时间、旧值与新值。例如:
用户表更新时,将修改前后的用户名、邮箱等信息写入审计日志表。
跨表联动更新。例如:
订单状态变为“已付款”后,触发库存表减少对应商品数量。
事件驱动流程自动化。例如:
库存低于阈值时,触发采购订单生成请求。
核心优势
将业务规则统一封装在数据库层,避免分散于多个应用,减少重复开发与维护成本。
触发器与触发操作绑定,响应无延迟且事务级执行,确保高一致性系统需求。
数据库层校验防止非法数据进入,例如:
BEFORE INSERT触发器验证用户年龄是否符合业务范围。
下沉复杂逻辑至数据库,使应用专注于界面与高层流程。例如:
应用无需编写日志记录代码,由触发器自动完成。
典型应用场景与案例
用户操作审计系统
场景:记录用户表关键字段(如姓名、邮箱)的修改历史。
实现:CREATE TRIGGER trg_user_update_auditAFTER UPDATE ON usersFOR EACH ROWBEGIN IF OLD.username <> NEW.username THEN INSERT INTO user_audit_log (user_id, field_name, old_value, new_value, changed_by) VALUES (OLD.id, 'username', OLD.username, NEW.username, CURRENT_USER); END IF;END;
效果:无论通过应用或直接SQL修改数据,审计日志均完整记录。
库存与订单联动更新
场景:订单状态变更时自动调整库存。
实现:CREATE TRIGGER trg_order_status_updateAFTER UPDATE ON ordersFOR EACH ROWBEGIN IF NEW.status = '已付款' AND OLD.status <> '已付款' THEN UPDATE inventory SET quantity = quantity - NEW.quantity WHERE product_id = NEW.product_id; END IF;END;
效果:避免应用层遗漏库存更新,防止超卖。
数据导入校验
场景:批量导入数据时强制符合业务规则(如日期格式、数值范围)。
实现:CREATE TRIGGER trg_data_import_checkBEFORE INSERT ON sales_dataFOR EACH ROWBEGIN IF NEW.sale_date NOT BETWEEN '2020-01-01' AND CURRENT_DATE THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Invalid sale date'; END IF;END;
效果:确保导入数据合法性,减少后续清洗成本。
注意事项
SQL触发器通过事件驱动与精细控制机制,在数据完整性、自动化与安全性方面提供不可替代的价值,合理使用可显著提升系统健壮性。