SHOW CREATE TRIGGER是获取触发器完整定义的最直接方式,必须指定db_name.trigger_name格式,区分大小写且不可加反引号;information_schema.TRIGGERS提供结构化元数据,但ACTION_STATEMENT被转义截断,无法直接执行。

用 SHOW CREATE TRIGGER 查看触发器完整定义
这是获取触发器原始创建语句的最直接方式,包含触发时机、事件、NEW/OLD 引用、分隔符处理等全部上下文。它不依赖外部表结构,也不受权限限制(只要对目标表有 TRIGGER 权限)。
执行前需确认触发器名和所属数据库:
-
SHOW CREATE TRIGGER语句必须指定数据库名和触发器名,格式为SHOW CREATE TRIGGER db_name.trigger_name - 如果当前不在目标数据库下,不写
db_name.会导致ERROR 1367 (HY000): Unknown trigger - 触发器名区分大小写,且不能加反引号包裹(否则报语法错误)
示例:
USE myapp; SHOW CREATE TRIGGER ins_log;
输出中 Create Trigger 字段即为可复用的建表语句,含 DELIMITER 变更逻辑,适合迁移或审计。
查 information_schema.TRIGGERS 获取元数据与依赖表
该视图提供结构化字段,能快速定位触发器关联的表、事件类型、SQL 模式、字符集等,尤其适合批量分析或脚本解析。
关键字段说明:
-
EVENT_OBJECT_SCHEMA和EVENT_OBJECT_TABLE:明确触发器绑定的数据库与表名,是判断「依赖关系」的第一依据 -
ACTION_STATEMENT:存储触发体 SQL,但已被转义(如换行变\n),不可直接执行;且长度截断为 65535 字节,长逻辑可能被截断 -
ACTION_TIMING(BEFORE/AFTER)和EVENT_MANIPULATION(INSERT/UPDATE/DELETE)共同决定触发器行为边界 -
DEFINER字段显示创建者账号,若触发器由admin@localhost创建,而当前用户无对应权限,即使能看到记录也无法调用或修改
常用查询:
SELECT EVENT_OBJECT_TABLE, ACTION_TIMING, EVENT_MANIPULATION, ACTION_STATEMENT FROM information_schema.TRIGGERS WHERE TRIGGER_SCHEMA = 'myapp' AND TRIGGER_NAME = 'ins_log';
识别隐式依赖:跨库表操作与函数调用
MySQL 不在元数据中显式记录触发器内部引用的其他表或函数,这类依赖只能靠人工解析 ACTION_STATEMENT 或 SHOW CREATE TRIGGER 输出。
容易漏掉的依赖点:
- INSERT/UPDATE 语句中写死的库名,例如
INSERT INTO audit.log_table ...—— 这里audit是硬依赖,删库会致触发器失效 - 调用自定义函数,如
SET @val = myfunc(NEW.id);—— 若myfunc被删除或变更签名,触发器运行时抛ERROR 1305 (42000): FUNCTION myapp.myfunc does not exist - 使用用户变量(
@sum)、系统变量(@@sql_mode)或临时表,它们不体现在TRIGGERS视图中,但影响行为一致性
建议在部署前用正则扫描 ACTION_STATEMENT 中的 INSERT INTO \w+\.\w+、CALL \w+、\w+\(\) 等模式。
注意 MySQL 8.0 的权限与隔离变化
MySQL 8.0 默认启用 sql_require_primary_key,且 information_schema.TRIGGERS 的可见性受 TRIGGER 权限控制,不再像 5.7 那样对所有用户开放。
常见权限陷阱:
- 普通用户执行
SHOW TRIGGERS只能看到自己DEFINER的触发器,看不到他人创建的,即使目标表可读 -
SELECT权限不足以读取information_schema.TRIGGERS,必须显式授予TRIGGER权限 - 从 MySQL 8.0.16 起,
DEFINER必须存在且拥有对应权限,否则触发器创建失败,但已存在的「孤儿触发器」仍可运行——这会让依赖检查变得隐蔽
验证权限是否到位:
SHOW GRANTS FOR CURRENT_USER; -- 检查输出中是否含 'TRIGGER ON *.*' 或 'TRIGGER ON `myapp`.*'
真正难排查的是跨库写操作与 DEFINER 权限错配,这两类问题往往只在生产环境数据变更时暴露,开发阶段几乎无法模拟。











