加载中...

| 时机选项 | BEFORE / AFTER / INSTEAD OF(视图) |
| 行内特殊变量 | NEW(修改后)、OLD(修改前) |
| 常见用途 | 审计日志、数据同步、自动填充字段 |
触发器由三个要素定义:触发时机(BEFORE / AFTER)、触发事件(INSERT / UPDATE / DELETE / TRUNCATE)和触发粒度(FOR EACH ROW 或 FOR EACH STATEMENT)。行级触发器在每行受影响时执行一次,语句级触发器对整条 SQL 执行一次。
在触发器体内,可以通过特殊变量访问变化前后的数据:MySQL 和 PostgreSQL 都提供了 NEW 和 OLD 伪记录,NEW.column 是操作后的值,OLD.column 是操作前的值,UPDATE 触发器可以同时访问两者。BEFORE 触发器甚至可以修改 NEW 的值来改变最终写入的内容,AFTER 触发器则适合做审计记录。[1]
触发器有个隐蔽的危险:逻辑不透明。应用层执行一条 INSERT,背后可能触发一连串级联触发器,排查问题时很难跟踪完整的执行链路。这也是为什么很多团队的开发规范明确禁止或限制使用触发器,将业务逻辑收归应用层。
另一个实际问题是性能:行级触发器在批量导入场景(如 LOAD DATA INFILE 几百万行)中会以行为单位反复调用触发器逻辑,几乎让批量导入退化为逐行插入。因此批量数据迁移前通常需要临时禁用触发器。
尽管如此,触发器在审计日志、数据变更历史记录等场景仍有不可替代的价值——它在数据库层面无法绕过,不依赖应用层的配合。

| 时机选项 | BEFORE / AFTER / INSTEAD OF(视图) |
| 行内特殊变量 | NEW(修改后)、OLD(修改前) |
| 常见用途 | 审计日志、数据同步、自动填充字段 |
登录 后参与讨论
暂无讨论,来发表第一条评论吧