SQL - 触发器

  • 触发器是在插入、更新和删除语句前后自动执行的一堆SQL代码,但是触发器被触发后只会执行一次,通常我们使用触发器增强数据的一致性。
  • 创建触发器
    • -- 创建触发器
      drop trigger if exists payments_after_insert;
      delimiter $$
      -- 在 payments表 insert 之后 触发 
      create trigger payments_after_insert
      	after insert on payments
          for each row 	-- 作用于受影响的每一行
      begin
      	update invoices
          set payment_total=payment_total + new.amount
          where invoice_id = new.invoice_id;
      end $$
      delimiter ;
      
      insert into payments
      values(default,5,3,'2019-01-01',10,1);
      select *
      from invoices;
      
      -- delete
      drop trigger if exists payments_after_delete;
      delimiter $$
      create trigger payments_after_delete
      	after delete on payments
          for each row
      begin
      	update invoices
          set payment_total=payment_total-old.amount
          where invoice_id=old.invoice_id;
      end$$
      delimiter ;
      
      delete 
      from payments
      where invoice_id=3;
  • 查看触发器
    • show triggers like'payments%'
  • 使用触发器进行审计
    • 触发器另一个常见用途,为了 审计的目的 而 记录对数据库的修改
    • drop trigger if exists payments_after_insert;
      delimiter $$
      -- 在 payments表 insert 之后 触发 
      create trigger payments_after_insert
      	after insert on payments
          for each row 	-- 作用于受影响的每一行
      begin
      	update invoices
          set payment_total=payment_total + new.amount
          where invoice_id = new.invoice_id;
          
          insert into payments_audit		-- 审计记录
          values(new.client_id,new.date,new.amount,'insert',now());
      end $$
      delimiter ;
      
      
      drop trigger if exists payments_after_delete;
      delimiter $$
      create trigger payments_after_delete
      	after delete on payments
          for each row
      begin
      	update invoices
          set payment_total=payment_total-old.amount
          where invoice_id=old.invoice_id;
          
          insert into payments_audit		-- 审计记录
          values(old.client_id,old.date,old.amount,'delete',now());
      end$$
      delimiter ;
      
      
      insert into payments
      values(default,5,3,'2019-01-01',10,1);
      select *
      from invoices;
      
      delete 
      from payments
      where invoice_id=3;
      
      SELECT * FROM payments_audit;	-- 查询审计记录表
      

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值