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;	-- 查询审计记录表
相关推荐
正在走向自律7 小时前
金仓数据库KingbaseES中级语法详解与实践指南
数据库·oracle·kingbasees·金仓数据库·信创改造
Gofarlic_oms17 小时前
Windchill用户登录与模块访问失败问题排查与许可证诊断
大数据·运维·网络·数据库·人工智能
我是小疯子667 小时前
Python变量赋值陷阱:浅拷贝VS深拷贝
java·服务器·数据库
Zoey的笔记本8 小时前
2026告别僵化工作流:支持自定义字段的看板工具选型与部署指南
大数据·前端·数据库
静听山水8 小时前
docker安装starrocks
数据库
学编程的小程8 小时前
从“兼容”到“超越”:金仓KESBSON引擎如何借多模融合改写文档数据库规则
数据库
千层冷面9 小时前
数据库分库分表
java·数据库·mysql·oracle
DBA小马哥9 小时前
金仓数据库引领国产化替代新范式:构建高效、安全的文档型数据库迁移解决方案
数据库·安全·mongodb·dba·迁移学习
企业对冲系统官9 小时前
基差风险管理系统日志分析功能的架构与实现
大数据·网络·数据库·算法·github·动态规划
冉冰学姐9 小时前
SSM学毕电设信息采集系统74v6w(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·学生管理·ssm 框架应用·学毕电设·信息采集系统