记录用户行为必须用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助手,依托大模型,帮助用户记录、整理和分析音视频内容,体验用大模型做音视频笔记、整理会议记录。
相关推荐
花青泽几秒前
5-数据库-SQL注入-联合查询-关键字绕过-day13笨鸟先飞,勤能补拙6 小时前
AI 赋能网络安全:技术全景、成熟度评估与实战案例天桥下的卖艺者6 小时前
使用scitable包,两步生成逆概率删失权重(IPCW)隔窗听雨眠6 小时前
AI原生数据库浪潮:国产数据库的架构重构与路径之争长和信泰光伏储能7 小时前
京津冀光伏发电:绿色能源的未来之路数据库小学妹7 小时前
数据库选型实战:从数据类型到TCO成本,五维决策框架+九款产品横评浦信仿真大讲堂7 小时前
从重复操作到自动化闭环:如何让 CST 与 Python 真正协同起来Gu Gu Study8 小时前
ScoutLoop开放域深度研究引擎(agent的初步设计想法)神龙天舞20018 小时前
MySQL 备库为什么会延迟好几个小时卷无止境8 小时前
写代码这件事,到底该讲究点什么?