跳转至

触发器

  • 触发器:在事件发生时自动执行
  • 触发器是MySQL响应以下任意语句而自动执行的一条MySQL语句(或一组语句)
    • DELETE
    • INSERT
    • UPDATE

创建触发器

  • 创建触发器时,需要给出4个信息:
    • 唯一的触发器名
    • 触发器关联的表
    • 触发器应该相应的活动DELETE|INSERT|UPDATE
    • 触发器何时执行(处理之前或之后)
  • 创建:
    • 语法:CREATE TRIGGER
      CREATE TRIGGER newproduct AFTER INSERT ON products
      FOR EACH ROW SELECT 'Product added' INTO @asd;
      -- 指定针对每个插入行执行,文本Product added将对每个插入的行显示一次
      
    • 一个表最多支持6个触发器(每个事件的发生前后各一个)

      只有表支持触发器,视图不支持触发器

触发器失败:如果BEFORE触发器失败,则MySQL不执行请求及其之后的操作(AFTER触发器)

删除触发器

DROP TRIGGER trigger_name

为了修改一个触发器,必须删除后,重新创建

使用触发器

INSERT触发器

  • 几点
    • INSERT触发器代码中,可以引用一个名为NEW的虚拟表,访问被插入的行
    • BEFORE INSERT触发器中,NEW中的值也可以被更新
    • 对于AUTO_INCREMENT列,NEWINSERT执行之前包含0,在INSERT执行之后包含新的自动生成值
      CREATE TRIGGER neworder AFTER INSERT ON orders
      FOR EACH ROW
      SELECT NEW.order_num INTO @asd;
      

DELETE触发器

  • 两点:
    • DELETE触发器代码中,可以引用一个名为OLD的虚拟表,访问被删除的行
    • OLD表中的值为只读,不能更新
      CREATE TRIGGER deleteorder AFTER DELETE ON orders
      FOR EACH ROW
      BEGIN
          INSERT INTO archive_orders(order_num, order_date, cust_id)
          VALUES(OLD.order_num, OLD.order_date, OLD.cust_id);
      END;
      

UPDATE触发器

  • 三点:
    • UPDATE触发器代码中,可以引用一个名为OLD的虚拟表,访问被更新前的行,可以引用一个名为NEW的虚拟表,访问被更新后的行
    • BEFORE UPDATE触发器中,NEW中的值可能也被更新
      • 允许更改将要被用于UPDATE语句的值
    • OLD中的值都是只读的,不能更新
      CREATE TRIGGER updatevendor BEFORE UPDATE ON vendors
      FOR EACH ROW
      SET NEW.vend_state = UCASE(NEW.vend_state);
      

进一步介绍

  • 创建触发器可能需要特殊的安全访问权限,但是触发器的执行时自动的
  • 应该使用触发器来保证数据的一致性
    • 在触发器中执行这种类型的处理优点是它总是进行这种处理,而且是透明的进行
  • 触发器的一种有意义的使用是创建审计跟踪
    • 利用触发器把更改记录到另一个表
  • 遗憾:在MySQL触发器中不支持CALL语句
    • 不能从触发器内调用存储过程,所需的存储过程代码需要复制到触发器内