必须用information_schema.triggers按event_object_table精确过滤,因show triggers like匹配触发器名而非表名,无法反向关联绑定关系,且不返回action_statement字段,易漏掉命名无关但实际作用于该表的触发器。

查某张表绑定了哪些触发器,不能靠 SHOW TRIGGERS LIKE '表名' 猜,必须用 information_schema.TRIGGERS 表按 EVENT_OBJECT_TABLE 字段精确过滤——这是唯一不会漏掉的路径。
为什么 SHOW TRIGGERS LIKE 'emp' 会漏掉触发器
SHOW TRIGGERS LIKE 匹配的是触发器名,不是表名。比如有个触发器叫 log_salary_changes,它绑在 emp 表上,但名字里没 emp,这条语句就完全看不到它。
- 触发器名和表名之间没有强制关联,命名全凭习惯
-
LIKE不支持跨字段反向查找(无法“根据表名找触发器名”) - 返回结果里没有
ACTION_STATEMENT字段,看不出逻辑是否真作用于该表 - 即使加了
FROM db_name,也还是按触发器名匹配,不是按绑定表
怎么精准查出某张表的所有触发器
执行这条语句,把 'emp' 替换成你的表名:
SELECT TRIGGER_NAME, ACTION_TIMING, EVENT_MANIPULATION, ACTION_STATEMENT FROM information_schema.TRIGGERS WHERE TRIGGER_SCHEMA = DATABASE() AND EVENT_OBJECT_TABLE = 'emp';
-
TRIGGER_SCHEMA = DATABASE()避免跨库误查,也绕过部分权限干扰 -
EVENT_OBJECT_TABLE是唯一能准确对应物理表的字段,注意大小写敏感:表是EMP就得写'EMP',写'emp'可能查不到 -
ACTION_STATEMENT字段可能被截断(MySQL 默认上限约 64KB),若末尾显示...,说明定义不全,得配合SHOW CREATE TRIGGER看完整逻辑
看到触发器名后,怎么确认它真正在干啥
元信息只能告诉你“有”,不能告诉你“做了什么”。下一步必须逐个查原始定义:
SHOW CREATE TRIGGER salary_audit;
- 返回结果中只有
Trigger列才是完整 SQL,别把sql_mode或Definer当成逻辑 - 重点检查
NEW./OLD.引用:字段名拼错、少加引号、在AFTER触发器里误改NEW行,都会导致静默失败或报错ERROR 1362 - 如果提示
ERROR 1356 (HY000),大概率是你没SELECT权限访问information_schema,或者触发器由其他用户创建且你无EXECUTE权限
真正隐蔽的触发器,往往藏在命名随意、权限隔离、或定义超长被截断的地方。别依赖模糊匹配,老老实实查 EVENT_OBJECT_TABLE 字段,再逐个 SHOW CREATE TRIGGER 核验逻辑——这步没法跳过,也绕不开。











