一、SHOW TRIGGERS 语句
基本语法:
SHOW TRIGGERS;
常用选项:
查看指定数据库的触发器 SHOW TRIGGERS FROM database_name;
查看指定模式的触发器(模糊匹配)
SHOW TRIGGERS LIKE 'pattern';
查看指定数据库和模式的触发器
SHOW TRIGGERS FROM database_name LIKE 'pattern';
使用\G格式化输出(在命令行中)
SHOW TRIGGERS\G
示例:查看所有触发器
SHOW TRIGGERS\G
输出结果解析:
属性 | 值 | 说明 |
---|---|---|
Trigger | trigupdate | 触发器名称 |
Event | UPDATE | 触发事件 (INSERT/UPDATE/DELETE) |
Table | account | 关联的表名 |
Statement | INSERT INTO myevent VALUES(1,'after update') | 触发器主体 |
Timing | AFTER | 触发时机 (BEFORE/AFTER) |
Created | 2020-02-24 14:07:15.08 | 创建时间 |
sql_mode | STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | SQL模式设置 |
Definer | root@localhost | 创建者 |
character_set_client | gbk | 客户端字符集 |
collation_connection | gbk_chinese_ci | 连接字符集 |
Database Collation | latin1_swedish_ci | 数据库字符集 |
优点:
语法简单,易于使用
显示信息格式友好
适合快速查看所有触发器
缺点:
无法筛选特定触发器
信息相对简略
不适合在程序中使用
二、查询 information_schema.triggers 表
基本语法:
SELECT * FROM information_schema.triggers WHERE condition;
常用查询示例:
1. 查看特定触发器
SELECT * FROM information_schema.triggers WHERE TRIGGER_NAME = 'trigupdate'\G
2. 查看特定数据库的触发器
SELECT * FROM information_schema.triggers WHERE TRIGGER_SCHEMA = 'test'\G
3. 查看特定表的触发器
SELECT * FROM information_schema.triggers WHERE EVENT_OBJECT_TABLE = 'account'\G
4. 查看特定类型的触发器
查看所有AFTER UPDATE触发器
SELECT * FROM information_schema.triggers WHERE ACTION_TIMING = 'AFTER' AND EVENT_MANIPULATION = 'UPDATE'\G
输出结果解析:
属性 | 值 | 说明 |
---|---|---|
TRIGGER_CATALOG | def | 触发器目录(通常为def) |
TRIGGER_SCHEMA | test | 触发器所在数据库 |
TRIGGER_NAME | trigupdate | 触发器名称 |
EVENT_MANIPULATION | UPDATE | 触发事件 |
EVENT_OBJECT_TABLE | account | 关联的表名 |
ACTION_STATEMENT | INSERT INTO myevent VALUES(1,'after update') | 触发器SQL语句 |
ACTION_ORIENTATION | ROW | 行级触发 |
ACTION_TIMING | AFTER | 触发时机 |
ACTION_REFERENCE_OLD_ROW | OLD | OLD伪表引用名 |
ACTION_REFERENCE_NEW_ROW | NEW | NEW伪表引用名 |
CREATED | 2020-02-24 16:07:15.08 | 创建时间 |
SQL_MODE | STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | SQL模式设置 |
DEFINER | root@localhost | 创建者账号 |
CHARACTER_SET_CLIENT | gbk | 客户端字符集 |
COLLATION_CONNECTION | gbk_chinese_ci | 连接字符集 |
DATABASE_COLLATION | latin1_swedish_ci | 数据库字符集 |
重要字段说明:
`TRIGGER_SCHEMA`: 触发器所在的数据库
`EVENT_MANIPULATION`: 触发事件类型
`ACTION_TIMING`: 触发时机
`ACTION_STATEMENT`: 触发器执行的SQL语句
`ACTION_ORIENTATION`: 触发粒度(总是ROW)
`ACTION_REFERENCE_OLD_ROW`: OLD伪表的引用名
`ACTION_REFERENCE_NEW_ROW`: NEW伪表的引用名
三、实用查询示例
1. 查看触发器的完整定义
SELECT TRIGGER_NAME, EVENT_OBJECT_TABLE, ACTION_TIMING, EVENT_MANIPULATION, ACTION_STATEMENT, CREATED, DEFINER FROM information_schema.triggers WHERE TRIGGER_SCHEMA = 'your_database';
2. 查找特定表的触发器
SELECT TRIGGER_NAME, ACTION_TIMING, EVENT_MANIPULATION, ACTION_STATEMENT FROM information_schema.triggers WHERE EVENT_OBJECT_TABLE = 'account' ORDER BY ACTION_TIMING, EVENT_MANIPULATION;
3. 查看触发器的依赖关系
SELECT TRIGGER_NAME, EVENT_OBJECT_TABLE as '表名', ACTION_STATEMENT as '触发操作' FROM information_schema.triggers WHERE ACTION_STATEMENT LIKE '%INSERT INTO%' OR ACTION_STATEMENT LIKE '%UPDATE%' OR ACTION_STATEMENT LIKE '%DELETE FROM%';
4. 获取触发器的创建语句
SELECT CONCAT( 'CREATE TRIGGER ', TRIGGER_NAME, ' ', ACTION_TIMING, ' ', EVENT_MANIPULATION, ' ', 'ON ', EVENT_OBJECT_TABLE, ' ', 'FOR EACH ROW ', ACTION_STATEMENT ) AS create_statement FROM information_schema.triggers WHERE TRIGGER_NAME = 'trigupdate';
四、使用 SHOW CREATE TRIGGER
查看触发器的完整创建语句:
SHOW CREATE TRIGGER trigger_name;
示例:
SHOW CREATE TRIGGER trigupdate;
输出结果:
Trigger sql_mode SQL Original Statement
trigupdate STRICT_TRANS_TABLES,... CREATE DEFINER=`root`@`localhost` TRIGGER trigupdate AFTER UPDATE...
五、可视化工具中的查看方式
在 MySQL Workbench、phpMyAdmin 等可视化工具中,通常可以通过以下方式查看触发器:
1. 选择数据库
2. 选择相关数据表
3. 查看"Triggers"选项卡
4. 可以看到该表的所有触发器列表
六、最佳实践和建议
1. 文档化:维护触发器的文档记录,包括用途和业务逻辑
2. 命名规范:使用一致的命名约定,如 `trg_[表名]_[时机]_[事件]`
3. 定期审查:定期检查触发器,确保它们仍然需要且性能良好
4. 权限管理:限制触发器的创建权限,避免过多的触发器影响性能
5. 测试环境:在生产环境修改前,在测试环境充分测试
七、注意事项
1. 权限要求:查看触发器需要相应的权限
2. 性能影响:频繁查询 `information_schema` 可能影响性能
3. 版本差异:不同 MySQL 版本的 `information_schema.triggers` 表结构可能略有不同
4. 字符集:注意字符集设置,避免显示乱码
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程