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;	-- 查询审计记录表
相关推荐
帅的被人砍xxx5 分钟前
mariadb 升级 (通过yum)
数据库·mariadb
通义灵码9 分钟前
MySQL 开发的智能助手:通义灵码在 IntelliJ IDEA 中的应用
数据库·mysql·阿里云·intellij-idea·通义灵码
mxs05231 小时前
抢购Python代码示例与技术解析
开发语言·数据库·python
Hadoop_Liang1 小时前
openEuler24.03 LTS下安装MySQL8.0.42
数据库·mysql·openeuler
LB21121 小时前
黑马 javaweb Day07 MySQL --DQL(查询)语句
android·数据库·mysql
掘根1 小时前
【MySQL】使用文件进行交互
数据库·mysql
昭阳~2 小时前
MySQL故障排查与生产环境优化
数据库·mysql·oracle
猴子请来的逗比4892 小时前
mysql的安装方式
linux·数据库·学习·mysql
酷爱码3 小时前
python如何遍历postgresql所有的用户表
python·postgresql·oracle
白初&3 小时前
CVE-2015-3934 Fiyo CMS SQL注入
数据库·sql