什么是触发器:
触发器是一种特殊的存储过程,它在试图更改触发器所保护的数据时自动执行。
有什么作用:
1. 优点
- 安全性
- 可以基于数据库的值使用户具有操作数据库的某种权利。
- 审计
- 可以跟踪用户对数据库的操作。
- 实现复杂的非标准的数据库相关完整性规则
- 触发器可以对数据库中相关的表进行连环更新
- 触发器能够拒绝或回退那些破坏相关完整性的变化,取消试图进行数据更新的事务
- 当插入一个与其主健不匹配的外部键时,这种触发器会起作用。
- 同步实时地复制表中的数据
- 自动计算数据值
- 如果数据的值达到了一定的要求,则进行特定的处理。
2. 弊端
- 如果需要变动整个数据集而数据集数据量又较大时,触发器效果会非常低
- 对于批量操作并不适合使用触发器
- 使用触发器实现的业务逻辑在出现问题时很难进行定位
- 特别是设计到多个触发器的情况协同开发时,写业务层代码如果不清楚数据库触发器的细节,容易搞不清到底触发了那些触发器
- 大量使用触发器会导致代码结构容易被打乱,阅读源码困难
怎么用
1. 创建
CREATE TRIGGER trigger_name
trigger_time
trigger_event ON table_name
FOR EACH ROW
trigger_stmt
名称 | 解释 | 取值 |
---|---|---|
trigger_name | 触发器名称 | 当前数据库中唯一 |
trigger_time | 触发时机 | BEFORE、AFTER |
trigger_event | 激活触发器的语句的种类 | INSERT、UPDATE、DELETE |
table_name | 关联表名 | 永久性表,不能将触发器与临时表或视图关联起来 |
trigger_stmt | 触发器程序体,要执行的内容 | 可以是一句SQL语句, 或者用 BEGIN 和 END 包含的多条语句 |
示例
CREATE TRIGGER add_item
AFTER INSERT
ON erp.item
FOR EACH ROW
INSERT INTO `erp`.`operation_log`
( `id`, `user_id`, `oper_name`, `module`, `msg`, `ip`, `host_name`, `create_time` )
VALUES
( 1, 1, '订单', '下单', '下单成功!', '101.102.101.102', 'gaoxizhi', '2019-11-17 22:15:22' );
2. 查看触发器
-- SHOW TRIGGERS [FROM schema_name];
SHOW TRIGGERS FROM erp;
3. 删除触发器
DROP TRIGGER IF EXISTS add_item;
4. 触发器的修改
5. 触发器的执行顺序
我们建立的数据库一般都是 InnoDB 数据库,其上建立的表是事务性表,也就是事务安全的。这时,若SQL语句或触发器执行失败,MySQL 会回滚事务,有:
1. 如果 BEFORE 触发器执行失败,SQL 无法正确执行。
1. SQL 执行失败时,AFTER 型触发器不会触发
1. AFTER 类型的触发器执行失败,SQL 会回滚