SQL - 触发器

  • 触发器是在插入、更新和删除语句前后自动执行的一堆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%'
  • 使用触发器进行审计

    • 触发器另一个常见用途,为了 审计的目的 而 记录对数据库的修改
    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;
        
        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;	-- 查询审计记录表
相关推荐
高兴就好(石2 小时前
DB-GPT部署和试用
数据库·gpt
这孩子叫逆2 小时前
6. 什么是MySQL的事务?如何在Java中使用Connection接口管理事务?
数据库·mysql
Karoku0662 小时前
【网站架构部署与优化】web服务与http协议
linux·运维·服务器·数据库·http·架构
码农郁郁久居人下3 小时前
Redis的配置与优化
数据库·redis·缓存
MuseLss4 小时前
Mycat搭建分库分表
数据库·mycat
Hsu_kk4 小时前
Redis 主从复制配置教程
数据库·redis·缓存
DieSnowK4 小时前
[Redis][环境配置]详细讲解
数据库·redis·分布式·缓存·环境配置·新手向·详细讲解
程序猿小D4 小时前
第二百三十五节 JPA教程 - JPA Lob列示例
java·数据库·windows·oracle·jdk·jpa
Flerken1015 小时前
数据库语言、SQL语言、数据库系统提供的两种语言
数据库·sql·oracle
掘根5 小时前
【网络】高级IO——poll版本TCP服务器
网络·数据库·sql·网络协议·tcp/ip·mysql·网络安全