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

news2024/11/26 0:28:43

文章目录

    • 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	#行级触发器		
BEGIN
	SQL语句
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
begin
	insert 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
begin
	insert 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
begin
	insert into xscjb_logs 
	(id,oper_type,oper_time,data_id,oper_log) 
	values (
		null,
		'update',						#操作类型改为update
		now(),
		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
begin
	insert 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
begin
	insert into xscjb_logs 
	(id,oper_type,oper_time,data_id,oper_log) 
	values (
		null,
		'delete',					#操作类型改为delete
		now(),
		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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1176009.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为什么江西的彩礼高?

作为一名江西土生土长的娃,今天和大家聊一聊江西的彩礼为何如此高? 江西的彩礼之所以高,主要与江西省的传统文化习俗、经济条件及社会观念等因素有关。那么我们从传统文化,经济条件,社会观念这三点出发。 1.传统文化习…

使用Kotlin与Unirest库抓取音频文件的技术实践

目录 摘要 一、Kotlin与Unirest库概述 二、使用Kotlin和Unirest抓取音频文件 1、添加Unirest依赖 2、发送HTTP请求获取音频文件 3、保存音频文件 三、完整代码示例 四、注意事项 结论 摘要 本文详细阐述了如何使用Kotlin编程语言与Unirest库抓取网络上的音频文件。首…

K8s:部署 CNI 网络组件+k8s 多master集群部署+负载均衡及Dashboard k8s仪表盘图像化展示管理

目录 1 部署 CNI 网络组件 1.1 部署 flannel 1.2 部署 Calico 1.3 部署 CoreDNS 2 负载均衡部署 3 部署 Dashboard 1 部署 CNI 网络组件 1.1 部署 flannel K8S 中 Pod 网络通信: ●Pod 内容器与容器之间的通信 在同一个 Pod 内的容器(Pod 内的容…

深度学习中的数据类型介绍:FP32, FP16, TF32, BF16, Int16, Int8 ...

文章目录 0. 前言1. 数据的存储方式2. 不同数据类型介绍2.1 深度学习中常用的数据类型2.2 BF16 类型的优势2.3 不同数据类型的使用场景 0. 前言 相比于 CPU,GPU 在架构设计时将更多的晶体管用于数据处理,而不是数据缓存和流量控制,因此可以高…

【Python基础】Python函数介绍(超全面、缺省参数、多值传参、可变参数等)

函数进阶 1.01. 函数参数和返回值的作用1.1无参数,无返回值1.2 无参数,有返回值1.3 有参数,无返回值1.4 有参数,有返回值 2.不可变和可变的参数3.多值参数 1.01. 函数参数和返回值的作用 函数根据 有没有参数 以及 有没有返回值&…

Maven3.9.1安装及环境变量配置

一、Maven的下载与安装 maven各版本下载地址 打开链接后自行选择对应版本 下载完成后解压安装,最好别选择c盘,安装目录路径等使用英文,避免产生其他问题 我这里选择的是D盘 二、Maven的环境变量配置 2.1、右键点击此电脑选择属性,点击高级系统设置,点…

Coremail与国家信息安全漏洞库(CNNVD)达成深度合作!

漏洞信息共享合作单位证书 近日,Coremail获得由国家信息安全漏洞库(CNNVD)颁发的“CNNVD漏洞信息共享合作单位”证书。 此证书是国家权威机构对Coremail安全研究技术和漏洞挖掘技术实力的充分肯定,也是双方合作的里程碑。 国家信…

Redis之Java操作连接操作Redis

前言 Java是一种强大的编程语言,而Redis是一个快速且具有高可扩展性的开源键值数据存储系统。使用Java操作Redis可以提高效率和性能,并且能够满足大规模数据存储和处理的需求。在本篇文章中,我们将介绍如何使用Java连接Redis,以及…

企业文件夹同步,怎样让数据管理更高效?

随着企业数据量的不断增加,如何高效地进行文件夹同步已成为企业提升工作效率、确保数据安全的重要一环。飞驰云联的同步软件作为一款专门针对企业级用户的数据同步解决方案,在实践中表现出色,值得信赖。 飞驰云联的同步软件是一款高效、稳定、…

axios下载csv文件下载-功能实现

须将axios 配置中的responseType设置为arraybuffer text/comma-separated-values, text/csv, application/csv, application/excel, application/vnd.ms-excel, application/vnd.msexcel // 下载文件 async exportConsumeList() {try {let res await exportConsumeList…

ASO优化之为应用创建屏幕截图的技巧(上)

屏幕截图是应用商店中最大的视觉元素之一。它们吸引用户的注意力,让他们对应用程序的外观有一个印象。我们需要改善并优化屏幕截图,来提高应用的转化率。 1、将用户的注意力吸引到正确位置。 显示部分屏幕截图而不是完整的设备。通过将原始资源减半&…

SS928 开发记录一 烧写

1.下载ToolPlatform 1.1设置芯片型号 1.2IP系统会自动根据主机设置 1.3选择烧写方式以及 eMMC分区表 1.4选择烧写文件 .bin、 kernel 、rootfs 2.烧录后通过串口连接 3.连接后写入环境变量 4.reset

『亚马逊云科技产品测评』活动征文|游戏出海云服务器选择

授权声明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 Developer Centre, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道 缘由 在国内流量红利见顶、版号暂停发放后,海外已经成为国内…

风险管理 相关的(ITTO)输入、工具与技术

信息系统项目管理 之「风险管理」相关的(ITTO)输入、工具与技术、输出 风险管理是项目管理的十大知识领域之一,包括如下7个过程。 1、规划风险管理 定义 规划风险管理是定义如何实施项目风险管理活动的过。 作用 确保风险管理的水平、…

01-详解静态代理,动态代理(JDK动态代理原理和CGLIB动态代理原理)

GoF之代理模式 概述 代理模式是GoF23种设计模式之一,属于结构型设计模式,本质就是通过引入代理对象间接实现对真实对象的操作 业务场景: 系统中有A、B、C三个模块,使用这些模块的前提是需要用户登录 此时就可以为A、B、C三个模块提供一个代理,代理的逻辑请求来了之后先判断…

vue + axios + mock

参考来源:Vue mock.js模拟数据实现首页导航与左侧菜单功能_vue.js_AB教程网 记录步骤:在参考资料来源添加axios步骤 1、安装mock依赖 npm install mock -D //只在开发环境使用 下载完成后,项目文件package.json中的devDependencies就会加…

【已解决】linux下轻松解决大多数软件依赖问题

【已解决】linux下轻松解决大多数软件依赖问题 通过aptitute安装 sudo apt install aptitudesudo aptitude install 软件包的名字以安装opencv过程中sudo apt-get install libgtk2.0-dev失败为例 先装aptitute sudo apt install aptitude再装libgtk2.0-dev sudo aptitude …

HR如何应用人才测评系统来开展招聘?

企业招聘:名额少,应聘者多,这是必然现象!如果提高招聘效率,成为企业最为关心的问题。 问题可能有 1、简历多筛选难 每次收到一堆的简历,如何从中筛选出有效的人才,是一件头疼的事&#xff0c…

【文末送书】Python界面开发与PyQt

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。关…

【微服务】一体化智慧工地管理平台源码

智慧工地系统是一种利用人工智能和物联网技术来监测和管理建筑工地的系统。它可以通过感知设备、数据处理和分析、智能控制等技术手段,实现对工地施工、设备状态、人员安全等方面的实时监控和管理。 一、智慧工地让工程施工智能化 1、内容全面,多维度数…