广告
返回顶部
首页 > 资讯 > 数据库 >mysql 触发器的使用及注意点
  • 126
分享到

mysql 触发器的使用及注意点

mysql 触发器使用mysql 触发器 2022-11-13 14:11:04 126人浏览 安东尼
摘要

目录前言一、触发器简介二、触发器特点及使用场景1、增强数据库的安全性2、实现数据库操作的日志审计3、实现复杂的级联操作三、触发器类似与核心参数四、触发器语法1、创建语法2、查看触发器

前言

在上一篇,我们详细了解了Mysql 存储过程 相关的内容,存储过程属于数据库编程的一种,使用存储过程可以在一定程度上减少程序与mysql服务的io交互的次数,提升性能;

本篇要介绍的是mysql的触发器,也属于数据库编程的一种,相对存储过程来说,使用起来更加简单,在某些特定的场景下使用触发器,同样可以达到减少应用程序与mysql服务器交互次数从而提升性能的目的;

一、触发器简介

触发器是一种特殊的存储过程,在定义触发器时会定义触发器的触发条件,使得触发器在满足触发条件时自动执行而不需要人为调用(存储过程需要人为参与);

触发器操作的是与表有关的数据库对象,比如在insert/update/delete之前(BEFORE)或之后(AFTER),触发并执行触发器中定义的SQL语句集合

二、触发器特点及使用场景

1、增强数据库的安全性

可以实现对用户操作数据库的限制,比如只允许用户在特定时间段内操作数据表,不允许用户对某些数据更改超过指定的范围

2、实现数据库操作的日志审计

使用触发器,可以跟踪用户对数据库的操作行为,把用户执行的一些操作自动记录到日志跟踪表中

3、实现复杂的级联操作

比如当创建一条订单数据时,需要同时往订单详情表,库存表,财务收支表等插入数据类似这样的操作就可以考虑使用触发器;

使用触发器,可以实现更加复杂的级联操作

三、触发器类似与核心参数

实际使用的时候,主要有3种类型的触发器可供选择:INSERT ,UPDATE ,和DELETE ,三种不同类型的触发器对应3种不同的使用场景;

  • INSERT 类型:通常涉及到数据新增的时候,定义这种类型的触发器,表示新增一条数据后,接下来要触发的动作;
  • UPDATE 类型:通常发生在修改一条数据时,定义这种类型的触发器,可以记录数据修改之前与修改之后的核心字段值;
  • DELETE 类型触发器:通常记录在某一次删除数据时,通过这种类型的触发器,记录某次删除数据时的核心参数;

在编写触发器的时候,有两个非常重要的参数对象,即 NEW 和 OLD,可以简单理解为,NEW 中保存并传递即将要完成插入的参数对象,而 OLD 记录的是插入或修改或删除之前的参数对象;

触发器类型与参数对象的对应关系如下所示:

触发器类型NEW 和 OLD
INSERT 型触发器NEW 表示将要或者已经新增的数据
UPDATE 型触发器OLD 表示修改之前的数据 , NEW 表示将要或已经修改后的数据
DELETE 型触发器OLD 表示将要或者已经删除的数据

四、触发器语法

了解了mysql触发器相关的理论知识后,下面就来了解下触发器的使用吧;

1、创建语法

CREATE TRIGGER trigger_name				-- 定义触发器名称
BEFORE/AFTER INSERT/UPDATE/DELETE		-- 定义触发器触发时机和类型
ON tbl_name FOR EACH ROW 				-- 行级触发器
BEGIN
	trigger_stmt ;						-- 触发器实际要执行的业务逻辑
END;

2、查看触发器

SHOW TRIGGERS ;

3、删除触发器

DROP TRIGGER [schema_name.]trigger_name ;  -- 如果没有指定 schema_name,默认为当前数 据库

五、触发器使用案例

准备两张表,一张业务表,一张日志记录表,模拟当业务表数据的增删改的时候,通过触发器将日志数据写到日志表;

业务表 user

CREATE TABLE `user` (
  `user_id` varchar(32) NOT NULL COMMENT '用户ID',
  `user_name` varchar(64) DEFAULT NULL COMMENT '昵称,表示用户真实姓名',
  `passwd` varchar(64) NOT NULL COMMENT '密码',
  `email` varchar(64) DEFAULT NULL COMMENT '邮箱',
  `mobile` varchar(32) DEFAULT NULL COMMENT '手机号',
  `address` varchar(128) DEFAULT NULL COMMENT '手机号',
  `ID` varchar(18) DEFAULT NULL COMMENT '身份证号',
  `sex` int(11) DEFAULT NULL COMMENT '用户性别 1:男 2:女',
  `info` varchar(255) DEFAULT NULL,
  `age` int(12) DEFAULT NULL,
  PRIMARY KEY (`user_id`),
  KEY `idx_name` (`user_name`),
  KEY `idx_mobile` (`mobile`),
  FULLTEXT KEY `info` (`info`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

日志表

CREATE TABLE user_logs (
	id INT (11) NOT NULL auto_increment,
	operation VARCHAR (20) NOT NULL COMMENT '操作类型, insert/update/delete',
	operate_time datetime NOT NULL COMMENT '操作时间',
	operate_id INT (11) NOT NULL COMMENT '操作的ID',
	operate_params VARCHAR (500) COMMENT '操作参数',
	PRIMARY KEY (`id`)
) ENGINE = INNODB DEFAULT charset = utf8;

六、INSERT类型 触发器使用

CREATE TRIGGER user_insert_trigger 
	after insert on `user` for each row 
begin 
	insert INTO user_logs (
		id,
		operation,
		operate_time,
		operate_id,
		operate_params
	)
values
	(
		null,
		'insert',
		now(),
		new.user_id,
		concat(
			'insert params: id=',
			new.user_id,

			',user_name = ',
			new.user_name,

			', passwd=',
			NEW.passwd,

			', email=',
			NEW.email,

			', mobile=',
			NEW.mobile,

			', address=',
			NEW.address

		)
	);
END;O user_logs (
		id,
		operation,
		operate_time,
		operate_id,
		operate_params
	)
values
	(
		null,
		'insert',
		now(),
		new.id,
		concat(
			'insert params: id=',
			new.id,

			',user_name = ',
			new.user_name,

			', passwd=',
			NEW.passwd,

			', email=',
			NEW.email,

			', mobile=',
			NEW.mobile,

			', address=',
			NEW.address

		)
	);
END;

创建完毕后,查看下刚刚创建的触发器

SHOW TRIGGERS ;

在这里插入图片描述

接下来通过给user表插入一条数据

insert into user(user_id,user_name,passwd,email,mobile,address)
values ('5','xiaowang','123456','xiaowang@qq.com','13325556761','杭州市余杭区')

数据插入成功后,检查日志表是否有数据写入

在这里插入图片描述

可以看到日志数据写入成功,说明触发器被触发了;

在这里插入图片描述

七、UPDATE 类型触发器使用

执行下面的语句进行触发器的创建

CREATE TRIGGER user_update_trigger AFTER UPDATE ON `user` FOR EACH ROW
BEGIN
	INSERT INTO user_logs (
		id,
		operation,
		operate_time,
		operate_id,
		operate_params
	)
VALUES
	(
		NULL,
		'update',
		now(),
		new.user_id,
		concat(
			'before update params: id=',
			OLD.user_id,

			',user_name=',
			OLD.user_name,

			', passwd=',
			OLD.passwd,

			', email=',
			OLD.email,

			', mobile=',
			OLD.mobile,

			' | after update params: id=',
			NEW.user_id,

			',user_name=',
			NEW.user_name,

			', passwd=',
			NEW.passwd,

			', email=',
			NEW.email,

			', mobile=',
			NEW.mobile
		)
	);
end;

在这里插入图片描述

然后执行下面的 update语句验证下该类型的触发器是否生效;

update `user` set user_name = 'xiaowang_1',passwd = '123456',email = 'xiaowang_update@qq.com' where user_id= '5';

cja

在这里插入图片描述

八、DELETE 类型触发器使用

执行下面的sql创进行触发器创建

create trigger user_delete_trigger
	after delete on `user` for each row
begin
	insert into user_logs(id, operation, operate_time, operate_id, operate_params)
VALUES
	(null, 'delete', now(), old.user_id,
concat('before delete: id=',old.user_id,',user_name=',old.user_name, ', mobile=', old.mobile, ', email=', old.email, ', address=', old.address));
end;

在这里插入图片描述

触发器创建完毕后,执行下面的delete sql,观察日志表是否有一条新增的数据

delete from user where user_id = ‘2’;

在这里插入图片描述

通过日志表发现,删除的触发器生效了;

九、触发器常用场景

1、使用触发器实现两表或多表数据同步

举例来说,现在有A表和A_copy表,A_copy表的存在的目的相对于是备份表,存储了A表中的关键业务字段,应用程序向A表插入一条数据时,需同步向A_copy表插入一条数据,这样的业务场景就可以考虑使用触发器;

2、审计日志记录

如上面的案例,向核心业务主表进行增删改操作时,记录审计日志可以考虑使用触发器;

3、合规性检查

比如向核心业务表添加涉及到金钱相关的数据时,可以设定一定的检查规则,比如当金额超过一定的数量时,及时提示错误,防止错误数据进入系统;

十、触发器使用注意点

合理利用触发器可以帮助应用程序减少与数据库的IO次数,一定程度上提升性能,但是触发器也有一些自身的缺点,在使用的时候需要注意,现做如下总结

1、可读性较差

触发器最大的一个问题就是可读性差,因为触发器存储在数据库中,并且由事件驱动,这就意味着触发器有可能不受应用层的控制 ,这对系统维护是非常有挑战的;

2、相关数据的变更,可能会导致触发器出错

特别是涉及到数据的表结构变更,都有可能导致触发器出错,进而影响数据操作的正常运行。这些都会由于触发器本身的隐蔽性,影响到应用中错误原因排查的效率;

到此这篇关于mysql 触发器使用详解的文章就介绍到这了,更多相关mysql 触发器使用内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: mysql 触发器的使用及注意点

本文链接: https://www.lsjlt.com/news/171468.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • mysql 触发器的使用及注意点
    目录前言一、触发器简介二、触发器特点及使用场景1、增强数据库的安全性2、实现数据库操作的日志审计3、实现复杂的级联操作三、触发器类似与核心参数四、触发器语法1、创建语法2、查看触发器...
    99+
    2022-11-13
    mysql 触发器使用 mysql 触发器
  • MySQL 触发器的使用及需要注意的地方
    关于触发器 现实开发中我们经常会遇到这种情况,比如添加、删除和修改信息的时候需要记录日志,我们就要在完成常规的数据库逻辑操作之后再去写入日志表,这样变成了两步操作,更复杂了。 又比如删除一个人员信息的时候,需要将他...
    99+
    2022-05-25
    MySQL 触发器
  • 【MySQL触发器】触发器的使用、创建、修改及删除
    目录 一、什么是触发器 二、创建触发器 ①创建一个insert事件触发器 ②创建一个delete 事件触发器  三、触发器包含多条执行语句 四、查看触发器  ①SHOW TRIGGERS语句查看触发器 ②查看系统表triggers实现查看触...
    99+
    2023-09-17
    mysql 数据库 sql database
  • MySQL触发器定义及其优缺点
    SQL触发器是一种特殊类型的存储过程。 这是特别的,因为它不像直接像存储过程那样调用。 触发器和存储过程之间的主要区别在于,当对表执行数据修改事件时,会自动调用触发器,而存储过程必须要明确地调用。 ...
    99+
    2022-10-18
  • mysql触发器简介、创建触发器及使用限制分析
    本文实例讲述了mysql触发器简介、创建触发器及使用限制。分享给大家供大家参考,具体如下: 简介 SQL触发器是存储在数据库目录中的一组SQL语句。每当与表相关联的事件发生时,即会执行或触发SQL触发器,例...
    99+
    2022-10-18
  • MYSQL触发器的使用
    概念:触发器是一种特殊的储存过程,在满足定义条件操作时触发,并且自动执行触发器中预先设定好的定义的语句集合 触发器是特殊的储存过程 触发器是在对表操作时,满足条件就可以自动调用预先编译的sql语句 安全性 可以基于数据库的值使用户...
    99+
    2021-10-21
    MYSQL触发器的使用
  • MySQL触发器的使用和优缺点介绍
    目录前言1. 触发器概述2. 触发器的创建2.1 创建触发器语法2.2 代码举例3. 查看、删除触发器3.1 查看触发器3.2 删除触发器4. 触发器的优缺点4.1 优点4.2 缺点...
    99+
    2022-11-12
  • 浅谈MySQL触发器的原理以及使用
    目录mysql 触发器触发程序的优点如下:MySQL 触发器 MySQL 数据库中触发器是一个特殊的存储过程,不同的是执行存储过程要使用 CALL 语句来调用,而触发器的执行不需要使用 CALL 语句来调用,也不需要手工...
    99+
    2023-05-20
    MySQL 触发器 MySQL触发器原理
  • React forwardRef的使用方法及注意点
    之前使用react.forwardRef始终无法应用于react高阶组件中,最近终于捣鼓出来了,于是记录下来。关键点就是React.forwardRef的API中ref必须指向dom...
    99+
    2022-11-12
  • MySQL触发器trigger的使用
    Q:什么是触发器?A:  触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。触发器的特性:  1、有begin end体,begin end;之间的语句可以写的简单或者复杂 ...
    99+
    2022-10-18
  • mysql触发器的缺点有哪些
    本篇文章为大家展示了mysql触发器的缺点有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。说明使用触发器实现的业务逻辑在出现问题时很难定位,尤其是涉及多个触发器时,会使后期维护困难。大量使用触发...
    99+
    2023-06-20
  • 使用MySQL触发器的教程
    下文主要给大家带来使用MySQL触发器的教程,希望这些内容能够带给大家实际用处,这也是我编辑使用MySQL触发器的教程这篇文章的主要目的。好了,废话不多说,大家直接看下文吧。MySQL包含对触发器的支持。触...
    99+
    2022-10-18
  • 使用mysql触发器的方法
    这篇文章主要讲解了使用mysql触发器的方法,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。什么是触发器:触发器用来在某些操作之后,“自动”执行一些操作。(比如插入了新的学生信息...
    99+
    2022-10-18
  • MySQL触发器的使用详解
    目录1.为什么需要触发器2.触发器概述3.触发器的创建3.1语法3.2 案例演示4.查看触发器5.删除触发器总结1.为什么需要触发器 有一些表是互相关联的,比如说商品表和库存表,我们...
    99+
    2022-11-13
  • mysql触发器的使用方法
    本篇内容主要讲解“mysql触发器的使用方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql触发器的使用方法”吧!说明触发器可以帮助应用于数据库,以确保数据的完整性、日志记录、数据验证等...
    99+
    2023-06-20
  • SQL触发器的使用及语法
    定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。常见的触发器有三种:分别应用于Insert , Update , Delete 事件。 我为...
    99+
    2015-02-12
    SQL触发器的使用及语法 数据库入门 数据库基础教程 数据库 mysql
  • WPF使用触发器需要注意优先级问题解决
    目录一、问题开始二、问题说明三、问题订正总结一、问题开始 现在有个需求:初始状态(未选中)的时候,CheckBox的Content 为 “乒乓球”,然后选中之...
    99+
    2023-01-30
    WPF触发器优先级 WPF触发器
  • 怎么使用MySQL触发器
    这篇文章主要讲解了怎么使用MySQL触发器,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。一、MySQL触发器创建:1、MySQL触发器的创建语法:CREATE [DEFINER...
    99+
    2022-10-18
  • 如何使用mysql触发器
    小编这次要给大家分享的是如何使用mysql触发器,文章内容丰富,感兴趣的小伙伴可以来了解一下,希望大家阅读完这篇文章之后能够有所收获。例子:创建触发器,记录表的增、删、改操作记录//创建user表; DRO...
    99+
    2022-10-18
  • MySQL触发器然后使用
    这篇“MySQL触发器然后使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MySQL触发...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作