SHOW CREATE TRIGGER 是获取完整可执行触发器 DDL 的唯一方式,包含 DEFINER、SQL SECURITY 等全部定义细节;SHOW TRIGGERS 仅返回简化元信息,不可用于迁移或审计。

SHOW TRIGGERS 只能看元信息,看不到完整 DDL
执行 SHOW TRIGGERS 或 SHOW TRIGGERS FROM mydb 返回的是触发器的名称、事件、表、时机等字段,但 Statement 列只显示主体 SQL 的简化版(不含 CREATE TRIGGER 头部、DEFINER、SQL SECURITY 等),也无法还原换行和缩进。它适合快速确认“有没有绑在某张表上”,但不能用于迁移或审计。
必须用 SHOW CREATE TRIGGER 获取完整 DDL
这是唯一能拿到可直接执行的创建语句的方式,包含所有定义细节:
-
SHOW CREATE TRIGGER必须带库名前缀,比如SHOW CREATE TRIGGER mydb.t_log_after_insert;不加库名会报Unknown trigger - 结果是单行记录,含
Trigger、sql_mode、Definer、Character_set_client等字段,真正可用的 DDL 在Create Trigger列里 - 导出到文件最简方式:
mysql -u user -p -e "SHOW CREATE TRIGGER mydb.t_audit_update" > t_audit_update.sql - 如果触发器名含特殊字符(如连字符),需用反引号包裹:
SHOW CREATE TRIGGER mydb.`t-user-log`
批量导出多个触发器:查 information_schema 拼接
当要导出十几个触发器时,逐个敲 SHOW CREATE TRIGGER 效率低。改用 information_schema.TRIGGERS 表拼接:
- 注意:MySQL 5.7 中
ACTION_STATEMENT字段只存触发体(即 BEGIN ... END 内容),不带CREATE TRIGGER头部,必须手动补全 - 安全写法示例(补全头部 + DELIMITER):
SELECT CONCAT('DELIMITER ;;\nCREATE DEFINER=', QUOTE(DEFINER), ' TRIGGER ', QUOTE(TRIGGER_SCHEMA), '.', QUOTE(TRIGGER_NAME), '\n', ACTION_TIMING, ' ', EVENT_MANIPULATION, ' ON ', QUOTE(TRIGGER_SCHEMA), '.', QUOTE(EVENT_OBJECT_TABLE), '\nFOR EACH ROW\n', ACTION_STATEMENT, ';;\nDELIMITER ;') FROM information_schema.TRIGGERS WHERE TRIGGER_SCHEMA = 'mydb' AND TRIGGER_NAME IN ('t1', 't2'); - 权限要求:需要对
information_schema.TRIGGERS有 SELECT 权限,且用户要有对应触发器的 TRIGGER 权限(否则某些字段为空)
mysqldump 导出触发器常被忽略的关键点
很多人以为 mysqldump mydb 就能导出触发器,实际几乎肯定失败:
- 必须显式加
--triggers参数;只加--routines不管用 - 即使加了
--triggers,若没指定具体表(比如只给了库名),MySQL 5.7 某些版本会跳过触发器——建议搭配--no-data --no-create-info并显式列出表:mysqldump --triggers --no-data --no-create-info mydb table1 table2 - 托管环境(如阿里云 RDS)通常禁用
--triggers,命令不报错但输出里根本没触发器语句,得靠SHOW CREATE TRIGGER绕行
DEFINER 和字符集上下文,直接复制粘贴到另一实例时,若目标库不存在同名用户或字符集不一致,可能执行失败。别只盯着语句本身,先核对 Definer 和 character_set_client 字段。


















