查某张表的触发器必须用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
MySQL 不支持直接写 SHOW TRIGGERS ON table_name 这类语法,SHOW TRIGGERS 本身不接受 ON 子句。想精准定位某张表(比如 emp)上的所有触发器,唯一可靠方式是查系统表:information_schema.TRIGGERS,并用 EVENT_OBJECT_TABLE 字段过滤。
执行这条语句即可:
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') -
ACTION_STATEMENT是触发器主体逻辑,但 MySQL 默认截断超长内容(上限约 64KB),若看到末尾是...,说明定义被截了
SHOW TRIGGERS 只能配合 LIKE 模糊筛表名
如果你没记住确切表名,或想快速扫一眼可能关联的触发器,SHOW TRIGGERS 支持 LIKE,但它是按触发器名匹配,不是按表名——所以得靠命名习惯反推。例如:
SHOW TRIGGERS LIKE 'emp_%';
这种写法依赖你当初建触发器时用了类似 emp_before_insert 的命名规则。实际中容易漏掉,因为:
- 触发器名和表名无强制关联,有人会叫
log_user_changes却绑在emp表上 -
SHOW TRIGGERS FROM db_name LIKE 'pattern'中的FROM参数在 MySQL 5.7 是支持的,但依然不能按表过滤 - 结果里没有
ACTION_STATEMENT字段,看不到具体逻辑,仅适合初筛
查看完整定义必须单个执行 SHOW CREATE TRIGGER
上面两种方式都只能看到触发器“元信息”,真要确认逻辑是否符合预期(比如有没有漏写 NEW. 或误用 OLD.),必须用 SHOW CREATE TRIGGER 查源码。但它不支持批量,也不能用子查询动态传名:
SHOW CREATE TRIGGER emp_after_update;
注意:
- 触发器名必须完全准确,大小写敏感(取决于系统变量
lower_case_table_names设置) - 返回结果中
Trigger列才是完整语句,sql_mode列只是当前会话模式,别混淆 - 如果提示
ERROR 1356 (HY000),常见原因是账号没SELECT权限访问information_schema,或触发器由其他用户创建且你无EXECUTE权限
容易忽略的权限与兼容性细节
即使语句写对,也可能查不到数据,原因往往不在 SQL 本身:
- 账号需有
SELECT权限才能查information_schema.TRIGGERS;若用低权限账号(如只给INSERT/UPDATE),结果为空也不报错 -
ACTION_STATEMENT字段在 MySQL 5.7 中默认为longtext,但某些客户端(如旧版 phpMyAdmin)会自动截断显示,建议用命令行或 DBeaver 直连验证 - 触发器定义中若含中文注释或特殊字符,
SHOW CREATE TRIGGER返回的语句可能被转义(如、\),复制执行前需人工清理
真正麻烦的是:触发器逻辑藏在 ACTION_STATEMENT 里,而这个字段在 information_schema 中不可更新、不可索引,也没法用正则搜索 —— 想批量检查所有触发器是否用了某个字段(比如 NEW.salary),只能导出后用脚本处理。











