尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

MySQL触发器可以实现自动审计记录吗_MySQL触发器审计实现方案

MySQL触发器可以实现自动审计记录吗_MySQL触发器审计实现方案 能但需手动编写逻辑在AFTER触发器中用USER()和NOW(3)记录操作人与时间审计表须独立设计、避免外键与冗余索引并注意MySQL 5.7/8.0在JSON支持与sql_log_bin上的差异。触发器能自动记录谁在什么时候改了哪条数据吗能但必须手动写逻辑MySQL 触发器本身不提供“审计”功能只提供执行时机BEFORE 或 AFTER和上下文OLD、NEW。你得自己决定记什么、存到哪、怎么防冲突。常见错误现象INSERT 时想读 OLD.id 报错UPDATE 里漏判 OLD.col ! NEW.col导致无变更也写日志没加 IF NOT (OLD.col NEW.col) 就直接记录日志爆炸。只在 AFTER INSERT/AFTER UPDATE/AFTER DELETE 中写审计日志避免事务回滚后日志残留用 USER() 获取当前连接用户不是应用层传的账号注意它返回 userhost 格式可能需 SUBSTRING_INDEX(USER(), , 1) 截取记录时间统一用 NOW(3)别用 SYS_DATE() 或 CURRENT_TIMESTAMP语义模糊部分版本行为不一致敏感字段如密码、手机号必须显式排除触发器里不会自动脱敏审计表结构怎么设计才不容易翻车核心原则审计表不能和原表强耦合否则改原表结构就崩。最容易踩的坑是直接用 CREATE TABLE audit_log LIKE origin_table —— 这会把主键、索引、默认值全抄过来而审计表根本不需要这些。正确做法是手建极简结构例如CREATE TABLE user_audit ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, table_name VARCHAR(64) NOT NULL, op_type ENUM(INSERT,UPDATE,DELETE) NOT NULL, pk_value VARCHAR(255) NOT NULL COMMENT 主键值转字符串存兼容复合主键, changed_fields JSON COMMENT 仅记录变更字段如 {email: [oldx.com, newx.com]}, operator VARCHAR(128) NOT NULL, created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3));pk_value 必须是 VARCHAR不能照搬原表主键类型——万一原表主键是 UUID 或复合键数值型字段撑不住别给审计表加外键否则删原表时会失败也别加索引到 changed_fieldsJSON 字段无法高效索引变更内容如果业务要求查“某人改过哪些订单”就在 operator 和 table_name 上建联合索引别一上来就全字段索引触发器里调用 INSERT INTO audit_log 为什么总报错最常见原因是触发器里试图修改当前正在被触发的表比如 user 表的 AFTER UPDATE 触发器再去 UPDATE userMySQL 直接报 Cant update table user in stored function/trigger。 Cleanup.pictures 智能移除图片中的物体、文本、污迹、人物或任何不想要的东西
返回列表