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;	-- 查询审计记录表
相关推荐
蒸蒸yyyyzwd5 分钟前
cpp选手秋招学习笔记day14
数据库·oracle
数据库小学妹14 分钟前
MySQL 8.4还是9.7 LTS?8.0 EOL后升级怎么选
数据库·mysql·dba·版本升级·数据库运维
存在morning18 分钟前
【PySpark 学习笔记 三】DataFrame API 入门
android·java·数据库
m0_5474866620 分钟前
《数据库原理及应用教程MySQL 8.0》全套PPT课件2026
数据库·mysql
程序员夏洛23 分钟前
MySQL 中的事务隔离级别有哪些?
数据库·mysql
冰暮流星26 分钟前
mysql之字符串函数
数据库·mysql
Csvn39 分钟前
📊 SQL 入门 Day 25:查询优化实战 —— 从 EXPLAIN 到索引的完整排查流
后端·sql
Csvn40 分钟前
📊 SQL 入门 Day 24:触发器与事件
后端·sql
m0_5474866641 分钟前
《Oracle数据库从入门到实战》全套PPT课件2026
数据库·oracle
2601_9657984742 分钟前
Evently Theme Setup Guide: Fast Conference, Meetup & Summit Architecture
服务器·网络·数据库