触发器未执行的首要原因是被禁用,需查information_schema.TRIGGERS中STATUS是否为ENABLED(MySQL)或sys.triggers中is_disabled是否为0(SQL Server);其次UPDATE无实际变更、TRUNCATE操作、跨库表名缺前缀、触发器内修改自身表(报ERROR 1442)、错误被静默吞没等也常见。

触发器根本没启用,查 information_schema.TRIGGERS 或 sys.triggers
“存在但不执行”最常见原因就是它被禁用了。MySQL 和 SQL Server 都不会报错、不提示、不写日志,它就安静地挂在那里。
- MySQL:运行
SELECT TRIGGER_NAME, STATUS FROM information_schema.TRIGGERS WHERE TRIGGER_NAME = 'your_trigger_name';,确认STATUS是ENABLED;若为DISABLED,需重建(MySQL 5.7 不支持ALTER TRIGGER ... ENABLE) - SQL Server:运行
SELECT name, is_disabled FROM sys.triggers WHERE name = 'your_trigger_name';,若is_disabled = 1,执行ENABLE TRIGGER your_trigger_name ON your_table; -
SHOW TRIGGERS只查当前库,跨库必须先USE db_name
UPDATE 没改数据,MySQL 8.0+ 默认跳过触发器
如果 UPDATE 语句未真正变更任何字段(例如 SET status = status 或 SET name = 'old' 而当前值就是 'old'),整个触发器会被静默跳过。
- 执行后立刻查
SELECT @@row_count;—— 若为0,说明没命中行或无实际变更 - 检查
SELECT @@sql_mode;,若含STRICT_TRANS_TABLES,这种无效更新会报错并中断;若不含,则可能静默跳过触发器 - 别信应用层返回的 “Query OK” —— 它只表示语法合法,不代表触发器跑了
触发器里改了自己这张表,直接报 ERROR 1442
MySQL 禁止在触发器中修改触发它的同一张表,这是硬限制,不是配置问题。一旦出现,直接报错 ERROR 1442 (HY000),且整个 DML 语句失败,但部分客户端不显示该错误。
- 常见场景:
AFTER UPDATE里又对本表做UPDATE;或BEFORE INSERT里查本表最大 ID 再赋值 - 错误不会出现在
SHOW WARNINGS里,得看 MySQL 错误日志(log_error文件),搜ERROR 1442 - 替代方案只有两个:把逻辑移到应用层(
INSERT后立刻UPDATE),或改用EVENT异步处理
错误被吞掉,根本看不到真实原因
触发器内出错,MySQL 默认不抛给客户端,而是让主语句失败或静默中断。你以为“没执行”,其实是执行到一半崩了,输出被吞了。
- 执行完疑似触发失败的
INSERT/UPDATE后,立刻运行SHOW WARNINGS;,常能捕获触发器内部的真实错误,比如Unknown column 'xxx' in 'field list' - 确保 MySQL 错误日志开启(
log_error配置项),并设为log_error_verbosity = 3,否则触发器内的警告会被忽略 - 避免在触发器里写裸
SELECT(除非接INTO变量),MySQL 5.7+ 会直接报错ERROR 1415 (0A000): Not allowed to return a result set from a trigger
INSERT INTO audit_log 应为 INSERT INTO sys_log.audit_log),也会导致静默失败。


















