最直接查看当前数据库触发器的方式是执行 show triggers,但仅显示名称、事件、表、时机等基础元数据,不包含完整定义;要获取完整触发器定义(如 action_statement),必须查询 information_schema.triggers 视图。

如何用 SHOW TRIGGERS 查看当前数据库的触发器
最直接的方式是执行 SHOW TRIGGERS,它默认只显示当前选中数据库(即 USE db_name 后的库)下的所有触发器信息。
注意:该命令不返回触发器的完整定义(比如 SQL 体),只展示名称、事件、表、时机、创建者等基础元数据。
- 执行前必须先选定数据库,否则报错
ERROR 1046 (3D000): No database selected - 若想跨库查看,需先
USE other_db,再运行SHOW TRIGGERS - 结果中
Statement列被截断(通常只显示前 64 字符),不能依赖它确认逻辑细节
如何从 INFORMATION_SCHEMA.TRIGGERS 获取完整触发器定义
要查源码、创建时间、SQL 模式、字符集等完整信息,必须查系统视图 INFORMATION_SCHEMA.TRIGGERS。这是唯一能拿到 EVENT_MANIPULATION、ACTION_TIMING 和完整 ACTION_STATEMENT 的地方。
示例查询:
SELECT TRIGGER_NAME, EVENT_OBJECT_TABLE, EVENT_MANIPULATION, ACTION_TIMING, ACTION_STATEMENT FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_SCHEMA = DATABASE();
-
TRIGGER_SCHEMA = DATABASE()确保只查当前库,避免权限不足时意外报错 -
ACTION_STATEMENT是原始 CREATE TRIGGER 语句的主体部分(不含CREATE TRIGGER ... ON ... FOR EACH ROW头部),含换行和空格,可直接用于审计或迁移 - 该视图对所有用户可见,但仅返回其有权限访问的触发器;无权限的触发器不会出现在结果里
为什么 SHOW CREATE TRIGGER 不能批量执行
SHOW CREATE TRIGGER trigger_name 只支持单个触发器,且必须指定准确名称——它不接受通配符、不支持子查询、也不能嵌套在存储过程中动态调用(除非用 PREPARE,但代价高、风险大)。
- 试图写
SHOW CREATE TRIGGER LIKE '%foo%'会报语法错误 - 若不知道触发器名,只能先用
SHOW TRIGGERS或查INFORMATION_SCHEMA.TRIGGERS拿到名字列表,再逐个执行 - 某些 MySQL 版本(如 5.7)对
SHOW CREATE TRIGGER返回的Definer字段权限校验严格,若当前用户不是 definer 且无SELECT权限,可能返回空或报错
权限与兼容性要注意的几个点
即使能连上 MySQL,也不代表能查全触发器元数据。关键权限和版本差异常被忽略。
- 需要
SELECT权限在INFORMATION_SCHEMA.TRIGGERS表上(MySQL 8.0+ 默认赋予,老版本可能需显式授权) - MySQL 5.7 及以前,
INFORMATION_SCHEMA.TRIGGERS中的ACTION_STATEMENT是 BLOB 类型,客户端可能显示为乱码或十六进制,需加CONVERT(ACTION_STATEMENT USING utf8mb4) - Percona Server 或 MariaDB 的
INFORMATION_SCHEMA.TRIGGERS字段略有不同(如多出SQL_MODE),不要硬编码字段序号取值
真正麻烦的是跨环境迁移时——开发库能看到的触发器,在生产库可能因权限隔离完全不可见,别只靠本地测试就认定“已查全”。











