查某张表绑定的所有触发器,必须用information_schema.triggers系统表过滤,执行select trigger_name, action_timing, event_manipulation, action_statement from information_schema.triggers where trigger_schema = database() and event_object_table = 'emp';

直接查 information_schema.TRIGGERS 是唯一可靠方式,SHOW TRIGGERS ON table_name 语法根本不存在,别浪费时间试。
为什么 SHOW TRIGGERS LIKE '表名' 很可能漏掉触发器
SHOW TRIGGERS LIKE 匹配的是触发器名,不是表名。比如你查 SHOW TRIGGERS LIKE 'emp',只能命中名字里含 emp 的触发器(如 emp_before_insert),但完全可能有人建了个叫 log_salary_changes 的触发器,却绑在 emp 表上——这种就彻底漏掉。
- 触发器名和表名之间没有强制约束,命名纯靠自觉
-
LIKE不支持通配符跨字段匹配,无法反向关联表 - 返回结果里没有
ACTION_STATEMENT字段,看不到逻辑是否真作用于该表
查某张表绑定的所有触发器,必须用系统表过滤
执行这条语句才能精准定位:
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看完整逻辑
看到触发器名后,怎么确认它真正在干啥
光看元信息不够,得看原始定义。比如查到有个触发器叫 salary_audit 绑在 emp 表上,下一步必须执行:
SHOW CREATE TRIGGER salary_audit;
- 返回结果中只有
Trigger列才是完整 SQL,别把sql_mode当成逻辑 - 检查
NEW./OLD.引用是否正确,常见错误是写成NEW.name却没加引号或拼错字段名 - 如果提示
ERROR 1356 (HY000),大概率是你没SELECT权限访问information_schema,或者触发器由其他用户创建且你无EXECUTE权限
真正隐蔽的触发器,往往藏在命名随意、权限隔离或定义超长被截断的地方。别依赖模糊匹配,老老实实查 EVENT_OBJECT_TABLE 字段,再逐个 SHOW CREATE TRIGGER 核验逻辑——这是唯一绕不开的路径。











