当前位置: 首页 > news >正文

第68讲:MySQL触发器的核心概念以及常见的触发类型应用案例

文章目录

    • 1.触发器的概念
    • 2.触发器操作的语法结构
    • 3.各类触发器的典型应用案例
      • 3.1.需求描述以及实现思路
      • 3.2.创建日志表
      • 3.3.INSERT类型的触发器
      • 3.4.UPDATE类型的触发器
      • 3.5.DELETE类型的触发器

1.触发器的概念

触发器是与表中数据相关的数据库对象,当表中的数据产生inster、update、delete这类操作时,可以通过触发器在这些动作之前或者之后,去完成相应的操作,例如向表中插入一条数据,插入数据之后通过触发器完成一些操作。

在触发器中会定义很多的SQL语句集合,当满足执行触发器的动作后,会执行触发器中的SQL语句。

触发器可以协助应用程序在数据库端确保数据的完整性、日志记录、数据校验等各种操作,触发器的最典型案例就是记录表中数据的操作日志,例如当增加一条数据时,就执行触发器中的逻辑,记录本次插入的数据内容到一张日志表中,当表中数据被修改后,就通过触发器在日志表中记录数据修改前后的内容,即使有误删除的情况下,也可以通过日志表快速恢复数据,同时也可以记录用户的行为。

可以使用触发器做一个类似回收站的功能,当产生DELETE语句时,将原数据写入到另外一张表,这张表就是回收站。

在触发器中有两类别名用来引用触发器中发生变化后的记录内容:

  • OLD:记录触发器发生变化前的数据内容,也就是旧的数据内容。
    • 例如我们对update操作设置了触发器,old会记录触发器发生变化前后的数据内容,通过old就可以引用update修改之前的数据内容。
  • NEW:记录触发器发生变化后的数据内容,也就是新数据内容。
    • 例如update的触发器,通过old会引用update之前的数据内容,同理,通过new就可以引用update之后的数据内容。

常见的触发器类型:

  • INSERT类型触发器
    • 在INSERT类型的触发器中,我们可以通过NEW别名来引用新增加的数据内容。
  • UPDATE类型触发器
    • 在UPDATE类型的触发器中,我们可以通过OLD引用数据修改前的内容,通过NEW来引用数据修改后的内容。
  • DELETE类型触发器
    • 在DELEET类型的触发器中,我们可以通过OLD来引用被删除的数据内容。

MySQL只支持行级触发器。

2.触发器操作的语法结构

创建触发器

CREATE TRIGGER 触发器名称
BEFORE/AFTER INSERT/UPDATE/DELETE				#BEFORE数据变动之前 AFTER数据变动之后 INSERT/UPDATE/DELETE表示触发器类型
ON 要对那张表设置触发器 FOR EACH ROW	#行级触发器		
BEGINSQL语句
END

查看触发器

SHOW TRIGGERS

删除

DROP TRIGGER 触发器名称

3.各类触发器的典型应用案例

3.1.需求描述以及实现思路

通过触发器去监控xscjb表,针对表中数据的增删改三类操作,将变更的内容以日志的形式记录到xscjb_logs表中。

我们要针对表中数据的增删改三类都要进行日志记录,那么需要分别对这三类的操作定义一个触发器。

实现思路:

  • 首先定义一张xscjb_logs表,用于记录xscjb表的增删改变更内容。
  • 然后分别对增删改三种操作定义触发器,触发器的执行要在增删改之后再执行。
  • 最后在触发器中定义SQL语句,通过insert语句将表数据变更前后的内容写入到日志表中,数据变更前的内容可以通过old.字段的方式获取,数据变更后的内容可以通过new.字段的方式获取。

插入数据的触发器只需要通过new别名来记录新数据的内容日志即可。

更新数据的触发器需要通过old记录更新前的数据内容,也要通过new记录更新后的数据内容,都写入到日志表。

删除数据的触发器只需要通过old来记录数据删除前的内容即可。

3.2.创建日志表

在日志表中可以定义这些字段:

1)操作类型:记录该条日志是针对什么类型的操作触发的,如insert。

2)操作时间:记录数据变动的执行时间,

3)发生变动的数据在原表的主键内容:记录变动的数据在原表的主键字段的内容。

4)日志内容:记录数据变动前后的内容。

create table xscjb_logs(id int not null auto_increment,oper_type varchar(10) not null comment '操作类型',oper_time datetime not null comment '操作时间',data_id int not null comment '变动的数据在原表的主键id',oper_log varchar(500) comment '数据变动前后的内容',primary key (id)
) 

3.3.INSERT类型的触发器

先来定义一个数据插入的触发器,当表中有数据插入时,通过INSERT类型的触发器,将插入的数据记录在日志表中。

1)创建触发器

create trigger xscjb_trigger_insert
after insert on xscjb for each row
begininsert into xscjb_logs (id,oper_type,oper_time,data_id,oper_log) values (null,'insert',now(),new.xh,concat('插入的数据内容为:xh=',new.xh,',xm=',new.xm,',ywcj=',new.ywcj,',sxcj=',new.sxcj,',yycj=',new.yycj));
end;

2)触发器每条语句的含义

create trigger xscjb_trigger_insert
after insert on xscjb for each row			#after表示数据变动之后执行触发器,insert表示是插入类型的触发器,当表中数据插入完成后再执行触发器,针对xscjb的触发器
begin#整个触发器中只有一条SQL,那就是将变动的数据插入到日志表中insert into xscjb_logs 				(id,oper_type,oper_time,data_id,oper_log) 			#为日志表中每一个字段都写入内容values (null,				#id字段不用写,id字段是主键,并且自增,无需填写内容'insert',			#操作类型字段填写insert即可,表示这是INSTER触发器产生的日志now(),				#操作时间字段可以通过now函数自动填写当前的日期时间new.xh,				#data_id字段要记录数据在原表的主键字段值,数据变动之后的内容都记录在new别名中,当然也可以使用old,但是insert语句没有old别名,因此我们可以通过引用new别名+指定的字段来读取数据变动后,该字段的内容,将读取到的主键内容写入到data_id字段concat('插入的数据内容为:xh=',new.xh,',xm=',new.xm,',ywcj=',new.ywcj,',sxcj=',new.sxcj,',yycj=',new.yycj)#操作日志字段主要记录数据变动前后的内容,由于是inster类型的触发器,只记录数据变动后新增的内容,作为日志内容即可,通过concat字符串拼接函数将内容形成一段话,然后将变动的每个字段值通过new别名进行引用,就可以拿到数据变动后的新内容);	
end;

3)向xscjb表写入数据,观察日志表是否有数据产生

为了更加直观,可以写入多条数据。

insert into xscjb values (NULL,'小江','88','77','66');

当xscjb这张表有数据插入,那么日志表就会通过触发器产生对应的inster日志,在data_id字段可以看到那条数据发生了数据变动,在oper_log字段可以看到具体的数据变更动作和变更的数据内容。

image-20220617234325902

3.4.UPDATE类型的触发器

INSTER类型的触发器定义完毕了,当有数据产生时,就会将产生的数据内容和动作记录在日志表里,下面来定义UPDATE类型的触发器,当有数据发生了变化,就将数据更新的前后内容都记录在日志表中。

1)创建触发器

create trigger xscjb_trigger_update 
after update on xscjb for each row
begininsert into xscjb_logs (id,oper_type,oper_time,data_id,oper_log) values (null,'update',now(),old.xh,concat('更新前的数据内容:xh=',old.xh,',xm=',old.xm,',ywcj=',old.ywcj,',sxcj=',old.sxcj,',yycj=',old.yycj,'  更新后的数据内容:xh=',new.xh,',xm=',new.xm,',ywcj=',new.ywcj,',sxcj=',new.sxcj,',yycj=',new.yycj));
end;

2)触发器每条语句的含义

触发器和INSERT类型的触发器语法结构一样,只不过改了几个关键字,对日志的内容增加了更加详细的内容。

create trigger xscjb_trigger_update 
after update on xscjb for each row			#update类型的触发器要将第二个关键字设置为update
begininsert into xscjb_logs (id,oper_type,oper_time,data_id,oper_log) values (null,'update',						#操作类型改为updatenow(),old.xh,				#这里要记录原始数据的主键值,由于是update类型,面向的是旧数据,因此通过old别名获取数据的主键值concat('更新前的数据内容:xh=',old.xh,',xm=',old.xm,',ywcj=',old.ywcj,',sxcj=',old.sxcj,',yycj=',old.yycj,'  更新后的数据内容:xh=',new.xh,',xm=',new.xm,',ywcj=',new.ywcj,',sxcj=',new.sxcj,',yycj=',new.yycj)#update语句会通过old别名记录更新前的数据,通过new记录更后的数据,为了方便查看,我们可以在操作日志中记录update更数据前后的数据内容,更新前通过old别名引用获取指定字段的数据,更新后通过new别名引用获取指定字段的数据);
end;

3)更新xscjb表中的数据观察日志表

update xscjb set ywcj = '100' where xm = '小黑';

当xscjb表的数据发生更改时,xscjb_trigger_update触发器就会向日志表中写入一条数据,记录数据更新前后的内容。

image-20220617235643041

3.5.DELETE类型的触发器

最后我们再来定义一个DELETE类型的触发器,当表中数据删除后,在日志表中记录被删除的数据内容。

1)创建触发器

create trigger xscjb_trigger_delete
after delete on xscjb for each row
begininsert into xscjb_logs (id,oper_type,oper_time,data_id,oper_log) values (null,'delete',	now(),old.xh,concat('删除的数据内容:xh=',old.xh,',xm=',old.xm,',ywcj=',old.ywcj,',sxcj=',old.sxcj,',yycj=',old.yycj));
end;

2)触发器每条语句的含义

create trigger xscjb_trigger_delete
after delete on xscjb for each row				#delete类型的触发器要将第二个关键字设置为delete
begininsert into xscjb_logs (id,oper_type,oper_time,data_id,oper_log) values (null,'delete',					#操作类型改为deletenow(),old.xh,				#这里要记录原始数据的主键值,由于是delete类型,面向的是旧数据,因此通过old别名获取数据的主键值concat('删除的数据内容:xh=',old.xh,',xm=',old.xm,',ywcj=',old.ywcj,',sxcj=',old.sxcj,',yycj=',old.yycj));			#最后将日志内容稍加变动即可
end;

3)删除多条数据观察日志表的记录

delete from xscjb where xh > '9';

删除的条件是xh大于9的,数据删除完成后,在日志表中会记录被删除的数据。

image-20220618000638627

相关文章:

第68讲:MySQL触发器的核心概念以及常见的触发类型应用案例

文章目录 1.触发器的概念2.触发器操作的语法结构3.各类触发器的典型应用案例3.1.需求描述以及实现思路3.2.创建日志表3.3.INSERT类型的触发器3.4.UPDATE类型的触发器3.5.DELETE类型的触发器 1.触发器的概念 触发器是与表中数据相关的数据库对象,当表中的数据产生in…...

VS Code 开发 Spring Boot 类型的项目

在VS Code中开发Spring Boot的项目, 可以导入如下的扩展: Spring Boot ToolsSpring InitializrSpring Boot Dashboard 比较建议的方式是安装Spring Boot Extension Pack, 这里面就包含了上面的扩展。 安装方式就是在扩展查找 “Spring Boot…...

数据中心加密:保障数据安全的重要一环

随着信息化的快速发展,数据已经成为企业的重要资产,数据安全也成为了企业面临的重大挑战。数据中心作为企业数据存储和管理的重要场所,其安全性对于整个企业的数据安全具有至关重要的作用。而数据中心加密则是保障数据安全的重要一环。本文将…...

分享90个节日庆典PPT,总有一款适合您

分享90个节日庆典PPT,总有一款适合您 PPT下载链接:百度网盘 请输入提取码 提取码:8888 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气,收集整理更不易。知识付费甚欢喜,为咱码农谋福利…...

Python Faker批量生成测试数据

一、前言 在做自动化测试或压力测试时会需要大批量生成测试数据,简单的方式你可以写一个存储过程使用随机函数来生成记录,但这种生成数据看起来不够真实,其实有蛮多现成的工具可以完成这一任务。 二、Faker基本使用介绍 faker是一个生成伪…...

Docker-compose 运行MySQL 连接不上

Docker-compose 运行MySQL 连接不上 📔 千寻简笔记介绍 千寻简笔记已开源,Gitee与GitHub搜索chihiro-notes,包含笔记源文件.md,以及PDF版本方便阅读,且是用了精美主题,阅读体验更佳,如果文章对你有帮助请帮我点一个Star~ 更新:支持在线阅读文章,根据发布日期分类…...

Educational Codeforces Round 2 D 计算几何

题目链接:Educational Codeforces Round 2 D 题目 给你两个圆。求它们相交处的面积。 输入 第一行包含三个整数 x1, y1, r1 (  - 109 ≤ x1, y1 ≤ 109, 1 ≤ r1 ≤ 109 ) - 第一个圆的圆心位置和半径。 第二行包含三个整数 x2, y2, r2 (  …...

hexo博客发布换电脑换地方了怎么办?

假如你有2台MacBook,一台在家,一台在公司。在家的hexo本地环境都搭好了,markdown文件等等也都放在本地source下的_posts文件夹里了。但是我过2天又想有个新文章发布,这时候电脑在公司,那么该怎么办? 把家里…...

最新知识付费变现小程序源码/独立后台知识付费小程序源码/修复登录接口

最新知识付费变现小程序源码,独立后台知识付费小程序源码,最新版修复登录接口。 主要功能 会员系统,用户登录/注册购买记录 收藏记录 基本设置 后台控制导航颜色 字体颜色 标题等设置 流量主广告开关小程序广告显示隐藏 广告主审核过审核…...

奥威BI软件 | 职场人的数据可视化救星

对时间紧张、工作繁重的职场人来说,一款易学易用、效率高、数据展现直观的数据可视化软件必不可少。奥威BI软件就是这样一款数据可视化软件,零编程开发报表,不需要额外多花时间,即可点击、拖拉拽完成数据分析、报表制作&#xff0…...

最长公共前缀[简单]

优质博文:IT-BLOG-CN 一、题目 编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串""。 示例 1: 输入:strs ["flower","flow","flight"] 输出&#xf…...

Java后端开发(十一)-- Mysql8的详细安装与环境配置

目录 1. mysql数据库下载 官网在线下载 2. 下载 MySQL的安装包 3. 安装MySQL...

什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码

🧸欢迎来到dream_ready的博客,📜相信您对这几篇博客也感兴趣o (ˉ▽ˉ;) 📜什么是SpringMVC?简单好理解!什么是应用分层?SpringMVC与应用分层的关系? 什么是三层架构&…...

PyTorch 从tensor.grad 看 backward(权重参数) 和 gradient accumulated

1. 新建一个自变量 tensor x import torchx torch.ones(1, requires_gradTrue) print(x)1. 输出: tensor([1.], requires_gradTrue)2. 写一个 forward import torchx torch.ones(1, requires_gradTrue) y x**2 z x**33. y, z 都 backward import torchx to…...

fedora 命令行代理proxychains 使用flatpak下载 flathub包

feodra 28 有 tsocks - (rpm 包)工具, 后面就没有了. 不过还有替代工具 proxychains 当前操作环境 Fedora 38 proxychains 配置文件所在位置 # 全局配置 /etc/proxychains.confproxychains looks for configuration in the following order: SOCKS5 proxy port in environme…...

介绍kamailio的dialog模块

# 介绍kamailio的dialog模块 kamailio的dialog模块一般有四个作用: - 读写对话变量 - 跟uac模块配合,完成uac trunk auth功能 - 统计early_dialogs和active_dialogs等 - 利用dialog profile实现分类统计功能或者实现呼叫限制功能 dialog模块的参数可以…...

性能优于BERT的FLAIR:一篇文章入门Flair模型

文章目录 What is FLAIR?FLAIR ModelContextual String Embedding for Sequence Labelingexample FLAIR Application AreaSentiment AnalysisNamed Entity RecognitionText Classification FLAIR一、什么是FLAIR?二、FLAIR Library的优势是什么&#xff…...

Weblogic ssrf漏洞复现

文章目录 一、漏洞描述二、漏洞特征1.查看uddiexplorer应用2.漏洞点 三、漏洞复现1.获取容器内网ip2.VULHUB Weblogic SSRF漏洞 docker中 centos6 无法启动的解决办法3.准备payload4.反弹shell 一、漏洞描述 SSRF 服务端请求伪造(Server-Side Request Forgery),是一种由攻击者…...

Memcached构建缓存服务器

Memcache介绍 1、特点 内置存储方式----------为了提高性能,memcached中保存的数据都存储在memcache内置的内存存储空间中。由于数据仅存在于内存中,重启操作系统会导致全部数据消失 简单key/value存储--------------服务器不关心数据本身的意义及结构&…...

vue3+element Plus实现弹框的拖拽、可点击底层页面功能

1、template部分 <el-dialog:modal"false"v-model"dialogVisible"title""width"30%"draggable:close-on-click-modal"false"class"message-dialog"> </el-dialog> 必须加的属性 modal:是否去掉遮罩层…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解

文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一&#xff1a;HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二&#xff1a;Floyd 快慢指针法&#xff08;…...

高分辨率图像合成归一化流扩展

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 1 摘要 我们提出了STARFlow&#xff0c;一种基于归一化流的可扩展生成模型&#xff0c;它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流&#xff08;TARFlow&am…...

Qwen系列之Qwen3解读:最强开源模型的细节拆解

文章目录 1.1分钟快览2.模型架构2.1.Dense模型2.2.MoE模型 3.预训练阶段3.1.数据3.2.训练3.3.评估 4.后训练阶段S1: 长链思维冷启动S2: 推理强化学习S3: 思考模式融合S4: 通用强化学习 5.全家桶中的小模型训练评估评估数据集评估细节评估效果弱智评估和民间Arena 分析展望 如果…...

【汇编逆向系列】六、函数调用包含多个参数之多个整型-参数压栈顺序,rcx,rdx,r8,r9寄存器

从本章节开始&#xff0c;进入到函数有多个参数的情况&#xff0c;前面几个章节中介绍了整型和浮点型使用了不同的寄存器在进行函数传参&#xff0c;ECX是整型的第一个参数的寄存器&#xff0c;那么多个参数的情况下函数如何传参&#xff0c;下面展开介绍参数为整型时候的几种情…...

iOS 项目怎么构建稳定性保障机制?一次系统性防错经验分享(含 KeyMob 工具应用)

崩溃、内存飙升、后台任务未释放、页面卡顿、日志丢失——稳定性问题&#xff0c;不一定会立刻崩&#xff0c;但一旦积累&#xff0c;就是“上线后救不回来的代价”。 稳定性保障不是某个工具的功能&#xff0c;而是一套贯穿开发、测试、上线全流程的“观测分析防范”机制。 …...

ubuntu清理垃圾

windows和ubuntu 双系统&#xff0c;ubuntu 150GB&#xff0c;开发用&#xff0c;基本不装太多软件。但是磁盘基本用完。 1、查看home目录 sudo du -h -d 1 $HOME | grep -v K 上面的命令查看$HOME一级目录大小&#xff0c;发现 .cache 有26GB&#xff0c;.local 有几个GB&am…...