什么是触发器:

  1. 触发器是一种特殊的存储过程,它在试图更改触发器所保护的数据时自动执行。

有什么作用:

1. 优点

  1. 安全性
    1. 可以基于数据库的值使用户具有操作数据库的某种权利。
  2. 审计
    1. 可以跟踪用户对数据库的操作。
  3. 实现复杂的非标准的数据库相关完整性规则
    1. 触发器可以对数据库中相关的表进行连环更新
    2. 触发器能够拒绝或回退那些破坏相关完整性的变化,取消试图进行数据更新的事务
    3. 当插入一个与其主健不匹配的外部键时,这种触发器会起作用。
  4. 同步实时地复制表中的数据
  5. 自动计算数据值
    1. 如果数据的值达到了一定的要求,则进行特定的处理。

2. 弊端

  1. 如果需要变动整个数据集而数据集数据量又较大时,触发器效果会非常低
  2. 对于批量操作并不适合使用触发器
  3. 使用触发器实现的业务逻辑在出现问题时很难进行定位
    1. 特别是设计到多个触发器的情况协同开发时,写业务层代码如果不清楚数据库触发器的细节,容易搞不清到底触发了那些触发器
  4. 大量使用触发器会导致代码结构容易被打乱,阅读源码困难

怎么用

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 会回滚