记录用户行为必须用AFTER触发器,因其能获取最终写入值;BEFORE无法获取UPDATE后的新值,且AFTER中禁止修改NEW/OLD等伪记录,否则引发递归写入错误。触发器里用 AFTER INSERT/UPDATE/DELETE 还是 BEFORE记录用户行为必须用 AFTER 触发器,BEFORE 会拿不到最终写入的值,尤其在 UPDATE 场景下------比如你改了 user_status 字段,BEFORE 里看到的还是旧值。AFTER 才能确保日志里存的是真实落地的数据。但注意:AFTER 不允许修改 NEW 或 OLD(MySQL)或 INSERTED/DELETED(SQL Server)里的字段,否则报错。常见错误现象:ERROR 1442 (HY000): Can't update table 'xxx' in stored function/trigger,本质是试图在 AFTER 触发器里再更新原表,形成递归写入。只对需要审计的表建 AFTER 触发器,别全库铺开避免在触发器里调用存储过程做复杂逻辑,容易锁表或超时PostgreSQL 用 FOR EACH ROW EXECUTE FUNCTION,语法位置和 MySQL 不同,别直接套用USER() 和 CURRENT_USER() 哪个能反映真实操作人CURRENT_USER() 返回连接认证时的账号(比如 'app@10.0.1.%'),而 USER() 返回客户端声明的用户名+IP(比如 'admin@192.168.2.5')。如果你的应用用统一数据库账号连库,那这两个都只能看到中间件账号,根本不是终端用户。这时候必须在 SQL 里显式传参,比如插入前加 SET @trace_user = 'zhangsan',再在触发器里读 @trace_user。使用场景:后台系统用连接池,所有请求都走 webapp@localhost,不传参就永远记不到谁点了删除按钮。MySQL 5.7+ 支持 INFORMATION_SCHEMA.PROCESSLIST 查当前连接的 USER,但触发器里不能查这个视图SQL Server 可用 ORIGINAL_LOGIN() 拿最初登录名,比 SUSER_NAME() 更可靠别依赖 HOSTNAME() 或 @@SPID,它们跟操作人完全无关日志表设计绕不开的三个字段:operation_type、old_data、new_data光记"谁什么时候改了哪张表"没用,得知道改了什么。建议日志表固定带 operation_type ENUM('INSERT','UPDATE','DELETE'),再配两个 JSON 字段存变更前后快照。MySQL 5.7+、PostgreSQL、SQL Server 2016+ 都支持 JSON 类型,比拼接字符串或用 TEXT 解析安全得多。 通义听悟 阿里云通义听悟是聚焦音视频内容的工作学习AI助手,依托大模型,帮助用户记录、整理和分析音视频内容,体验用大模型做音视频笔记、整理会议记录。
相关推荐
程序员龙叔14 小时前
编写高质量 Skill 系列 -- 如何设计需求分析与用例生成的 SKILL用户83562907805117 小时前
使用 Python 操作 Word 内容控件源分享18 小时前
Java线程同步的多种实现方法(非常详细)码云骑士18 小时前
32-慢查询排查全流程(下)-索引优化实战与最左前缀原则麦聪聊数据19 小时前
数据服务化时代:企业数据能力输出的核心路径shushangyun_19 小时前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?JAVA96519 小时前
JAVA面试-JVM篇 03-JVM运行时数据区哪些是线程私有的哪些是共享的闵孚龙19 小时前
《PyTorch 深度修炼》Dataset 和 DataLoader:数据如何喂给模型DARLING Zero two♡19 小时前
【MySQL数据库】数据类型与表约束