记录用户行为必须用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助手,依托大模型,帮助用户记录、整理和分析音视频内容,体验用大模型做音视频笔记、整理会议记录。
相关推荐
测试19982 小时前
软件测试 - 单元测试总结廿一夏5 小时前
MySql存储引擎与索引曲幽5 小时前
我用了FastApiAdmin后,连夜把踩过的坑都整理出来了前端若水6 小时前
会话管理:创建、切换、删除对话历史lzhdim6 小时前
SQL 入门 15:SQL 事务:从 ACID 到四种常见的并发问题瀚高PG实验室7 小时前
瀚高企业版V9.1.1在pg_restore还原备份文件时提示extract函数语法问题涛声依旧-底层原理研究所7 小时前
残差连接与层归一化通俗易懂的详解csdn_aspnet7 小时前
Python 算法快闪 LeetCode 编号 70 - 爬楼梯TDengine (老段)7 小时前
TDengine Tag 设计哲学与 Schema 变更机制fantasy_arch7 小时前
pytorch人脸匹配模型