1. 触发器基础概念解析
数据库触发器(Trigger)是一种特殊的存储过程,它会在特定数据库事件发生时自动执行。与普通存储过程不同,触发器没有显式调用接口,而是由数据库系统在满足预设条件时隐式触发执行。
1.1 触发器的核心特性
触发器具有三个关键特性:
- 事件驱动:与特定表事件(INSERT/UPDATE/DELETE)绑定
- 自动执行:满足条件时由DBMS自动调用
- 事务特性:作为触发语句所在事务的一部分执行
在实际项目中,我经常使用触发器来处理这些场景:数据审计追踪、复杂业务规则实施、跨表数据同步等。特别是在需要保证数据一致性的金融系统中,触发器能有效减少应用层代码的复杂度。
1.2 触发器类型矩阵
根据触发时机和事件组合,触发器可分为以下类型:
| 触发时机 | INSERT事件 | UPDATE事件 | DELETE事件 |
|---|---|---|---|
| BEFORE | BEFORE INSERT | BEFORE UPDATE | BEFORE DELETE |
| AFTER | AFTER INSERT | AFTER UPDATE | AFTER DELETE |
| INSTEAD OF | INSTEAD OF INSERT | INSTEAD OF UPDATE | INSTEAD OF DELETE |
注意:INSTEAD OF触发器主要用于视图,在视图上执行DML操作时替代默认行为
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 触发器创建语法详解
2.1 标准创建语法
sql复制CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER | INSTEAD OF}
{INSERT | UPDATE [OF column_list] | DELETE}
ON table_name
[REFERENCING {OLD [AS] old_name | NEW [AS] new_name}]
[FOR EACH ROW]
[WHEN (condition)]
trigger_body
我在实际开发中发现几个关键点:
- OR REPLACE:允许覆盖同名触发器(生产环境慎用)
- OF column_list:仅当指定列更新时触发
- REFERENCING:自定义新旧记录的别名
- FOR EACH ROW:定义行级触发器(缺省为语句级)
2.2 不同数据库的语法差异
虽然SQL标准定义了触发器语法,但各数据库实现存在差异:
| 特性 | MySQL | Oracle | SQL Server | PostgreSQL |
|---|---|---|---|---|
| INSTEAD OF | × | √ | √ | √ |
| WHEN子句 | × | √ | × | √ |
| 多事件触发器 | × | √ | √ | √ |
例如在Oracle中创建多事件触发器:
sql复制CREATE TRIGGER audit_employee
BEFORE INSERT OR UP
