如何记录SQL谁修改了数据_添加更新人字段与触发器同步
最稳方式是用AFTER UPDATE触发器配合ORIGINAL_LOGIN()兜底updated_by用sysname类型需加IF UPDATE判断防递归避免复杂逻辑。SQL Server 里怎么自动填 updated_by 字段靠应用层写死用户名不靠谱一出错就全乱用 CURRENT_USER 或 SUSER_SNAME() 倒是可以但得每个 UPDATE 语句手动加漏一个就断链。最稳的方式是用 AFTER UPDATE 触发器在数据库层兜底。触发器能拿到执行上下文里的登录名哪怕应用用了连接池、统一账号也能通过 ORIGINAL_LOGIN() 拿到真实操作人——这个函数比 SUSER_SNAME() 更准它不随 EXECUTE AS 切换而变。updated_by 字段类型建议用 sysname等价于 nvarchar(128)别用 varchar(50)Windows 登录名可能超长触发器里必须加 IF UPDATE(updated_at) 判断否则自更新时间字段也会触发造成无限递归别在触发器里做复杂逻辑比如查用户表补全姓名IO 和锁会拖慢所有 UPDATEMySQL 8.0 怎么让 modified_by 自动更新MySQL 不支持 AFTER UPDATE 触发器里直接改 NEW 行报错 Cant update table in stored function/trigger所以不能像 SQL Server 那样“改完再存”。得换思路用触发器只负责赋值把更新动作交给主语句本身。更实际的做法是把 modified_by 改成 DEFAULT CURRENT_USER然后要求所有 UPDATE 显式带上这个字段UPDATE orders SET status shipped, modified_by CURRENT_USER WHERE id 123;这听着反直觉但比硬上触发器更可控。因为CURRENT_USER 返回授权账号USER() 才返回连接账号——多数场景要的是后者得用 USER()如果应用用的是中间件或代理如 ProxySQLUSER() 可能全是 app10.%这时就得靠应用传入 SET app_user zhangsan触发器读 app_userMySQL 8.0.16 支持 SET PERSIST但无法持久化会话变量所以别指望靠全局变量兜底PostgreSQL 的 current_user 和 session_user 该选哪个PostgreSQL 里 current_user 是当前执行权限所属角色session_user 是连接时认证的角色。如果你用的是统一数据库账号 SET ROLE 切换那必须用 session_user否则看到的全是 app_admin。 通义听悟 阿里云通义听悟是聚焦音视频内容的工作学习AI助手依托大模型帮助用户记录、整理和分析音视频内容体验用大模型做音视频笔记、整理会议记录。