SHOW TRIGGERS需先USE数据库,仅显示触发器名、表、事件类型、时机和截断的Statement;查某表触发器须用information_schema.TRIGGERS;看完整定义必须用SHOW CREATE TRIGGER指定准确名称。

直接查当前库所有触发器用 SHOW TRIGGERS
执行前必须先 USE your_db_name;,否则报错 ERROR 1046 (3D000): No database selected。这条命令最轻量,适合快速扫一眼:触发器名、绑定的表、事件类型(INSERT/UPDATE/DELETE)、时机(BEFORE/AFTER)和简略的 Statement。
Statement 列默认只显示前 64 字符,会被截断——你看到的可能是 INSERT INTO log ...,但后面有没有 WHERE 条件、有没有 IF 分支,完全看不出来。别靠它确认逻辑。
支持模糊筛选,比如:SHOW TRIGGERS LIKE 'emp_%';
但注意:这是按触发器名匹配,不是按表名。如果触发器叫 audit_user_changes 却绑在 emp 表上,这条命令就漏掉了。
精准查某张表上的触发器必须查 information_schema.TRIGGERS
MySQL 不支持 SHOW TRIGGERS ON emp 这种语法,SHOW TRIGGERS 本身不接受 ON 子句。唯一可靠方式是查系统表:
SELECT TRIGGER_NAME, ACTION_TIMING, EVENT_MANIPULATION, ACTION_STATEMENT FROM information_schema.TRIGGERS WHERE TRIGGER_SCHEMA = DATABASE() AND EVENT_OBJECT_TABLE = 'emp';
EVENT_OBJECT_TABLE 字段存的是触发器绑定的表名,注意它不区分大小写但严格匹配字符串——表名是 EMP 就得写 'EMP',写 'emp' 在某些配置下可能查不到。
ACTION_STATEMENT 是触发器主体 SQL,但 MySQL 默认截断超长内容(上限约 64KB)。如果结尾是 ...,说明定义被砍了,得结合 SHOW CREATE TRIGGER 看全貌。
要看完整可执行定义只能用 SHOW CREATE TRIGGER
它返回的是带 CREATE TRIGGER 头部的原始语句,含分号、DELIMITER 设置、DEFINER 等全部信息,能直接复制重建。但它不支持批量、不能模糊匹配、也不能嵌套调用:
- 必须指定准确名称:
SHOW CREATE TRIGGER emp_before_insert; - 跨库要写全名:
SHOW CREATE TRIGGER mydb.emp_before_insert;,漏库名就报ERROR 1360 (HY000): Trigger does not exist - 触发器名区分大小写(取决于
lower_case_table_names系统变量),Linux 下常见因大小写不匹配查不到
如果你不知道名字,得先用 SHOW TRIGGERS 或查 information_schema.TRIGGERS 拿到列表,再逐个执行。别试图写 SHOW CREATE TRIGGER LIKE '%emp%',语法直接报错。
权限和字符集容易卡住查询结果
即使能连上 MySQL,也不代表能查全触发器:
- 查
information_schema.TRIGGERS需要对该视图的SELECT权限(MySQL 8.0+ 默认赋予,5.7 可能需显式授权) -
SHOW CREATE TRIGGER对DEFINER权限校验严格:如果当前用户不是创建者,且没被授予SELECT权限,可能返回空或报错 -
ACTION_STATEMENT里换行符被转义成\n,复制出来要手动替换才能执行
真正麻烦的不是语法记不住,而是查到了却看不到完整逻辑——SHOW TRIGGERS 截断、information_schema.TRIGGERS 被权限拦住、SHOW CREATE TRIGGER 又要求精确名称。三个命令得配合着用,缺一不可。


















