最可靠的方式是直接查询 information_schema.TRIGGERS 和 information_schema.ROUTINES;前者可按 TRIGGER_SCHEMA 精确筛选触发器,后者统一管理函数与存储过程。

直接查 information_schema.TRIGGERS 和 information_schema.ROUTINES 是最可靠的方式,比 SHOW TRIGGERS 或 SHOW FUNCTION STATUS 更完整、可过滤、可跨库比对。
查当前库所有触发器:用 WHERE 过滤 TRIGGER_SCHEMA
MySQL 不允许 SHOW TRIGGERS 指定数据库名(除非先 USE),但 information_schema.TRIGGERS 可以直接按库名筛选。关键点是必须用 TRIGGER_SCHEMA 字段,不是 EVENT_OBJECT_SCHEMA(后者在某些旧版本里为空或不准):
-
TRIGGER_SCHEMA = DATABASE()能动态匹配当前库,不用硬编码库名 - 若要查其他库,把
DATABASE()换成字符串,如'my_app',注意单引号不能少 -
ACTION_STATEMENT字段含触发器主体 SQL,但会被截断(默认 64KB 限制),超长逻辑可能看不到全貌
SELECT TRIGGER_NAME, EVENT_OBJECT_TABLE AS `Table`, ACTION_TIMING AS `Timing`, EVENT_MANIPULATION AS `Event`, ACTION_STATEMENT AS `Definition` FROM information_schema.TRIGGERS WHERE TRIGGER_SCHEMA = DATABASE();
查当前库所有函数(含存储过程):ROUTINES 表统一管理
information_schema.ROUTINES 同时存函数(FUNCTION)和存储过程(PROCEDURE),靠 ROUTINE_TYPE 区分。它比 mysql.proc 更标准,且不依赖权限访问 mysql 系统库:
-
ROUTINE_SCHEMA对应数据库名,同样可用DATABASE()动态获取 -
ROUTINE_DEFINITION是函数/过程的完整 SQL 体,但默认被 MySQL 隐藏(DEFINER权限不足时为空),需确保账号有SELECT权限 - 想只看函数?加条件
AND ROUTINE_TYPE = 'FUNCTION';只看过程?用'PROCEDURE'
SELECT ROUTINE_NAME, ROUTINE_TYPE, DATA_TYPE, ROUTINE_DEFINITION FROM information_schema.ROUTINES WHERE ROUTINE_SCHEMA = DATABASE() AND ROUTINE_TYPE = 'FUNCTION';
为什么不用 SHOW 命令而选 information_schema?
SHOW TRIGGERS 和 SHOW FUNCTION STATUS 返回字段少、不可 JOIN、不支持 ORDER BY 或 LIMIT,调试或自动化时很受限:
-
SHOW TRIGGERS不返回ACTION_STATEMENT,看不到逻辑,只能配合SHOW CREATE TRIGGER单个查 -
SHOW FUNCTION STATUS的Comment字段常为空,无法判断函数用途 -
information_schema表可与其他表JOIN(比如关联系统表查权限)、导出为 CSV、嵌入 Python 脚本批量处理 - 某些托管 MySQL 服务(如阿里云 RDS)会禁用部分
SHOW命令,但通常放行information_schema查询
容易被忽略的权限与字符集问题
即使语句写对,也可能查不到内容或字段为空:
- 账号必须对
information_schema有SELECT权限(多数账号默认有,但最小权限部署时可能被收回) -
ROUTINE_DEFINITION为空?检查账号是否是函数的DEFINER,或是否有SELECT权限在mysql.proc上(5.7+ 已弱化依赖) - 查询结果中文乱码?确认客户端连接字符集是
utf8mb4,执行SET NAMES utf8mb4;再查 - 触发器定义里含换行或注释,
ACTION_STATEMENT会原样返回,但某些终端(如旧版 MySQL CLI)可能显示错位,建议加\G查看


















