mysql 触发器的使用及注意点

目录
  • 前言
  • 一、触发器简介
  • 二、触发器特点及使用场景
    • 1、增强数据库的安全性
    • 2、实现数据库操作的日志审计
    • 3、实现复杂的级联操作
  • 三、触发器类似与核心参数
  • 四、触发器语法
    • 1、创建语法
    • 2、查看触发器
    • 3、删除触发器
  • 五、触发器使用案例
  • 六、INSERT类型 触发器使用
  • 七、UPDATE 类型触发器使用
  • 八、DELETE 类型触发器使用
  • 九、触发器常用场景
    • 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 触发器使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Mysql中的触发器简单介绍及使用案例

    什么是触发器? 触发器是数据库的一个程序,他是用来监听着数据表的某个行为,一旦数据表的这个行为发生了,马上执行相应的sql语句 触发器的语法结构: create trigger 触发器的名称触发器事件 on 监听的表名 for each row 行为发生后执行的sql语句 触发器事件组成::两部分组成: 触发器事件发生的时间-----是在监听的表的行为 after before 常用的是after 触发器执行的内容:增删改 创建order 表的时候,需要注意,因为order在mysql中是一个关

  • MySQL触发器的使用

    触发器可以在执行语句前或执行后触发其他 SQL 代码运行.触发器可以读取触发语句改变了哪些数据,但是没有返回值.因此可以使用触发器加强业务逻辑的约束而不需要在应用程序写对应的代码. 从上述描述可以看到,触发器可以简化应用程序的逻辑并且可以提升性能,这是因为使用触发器减少了应用程序和服务端的交互次数.同时,触发器有助于完成自动更新归一化和统计数据.例如,我们可以使用触发器自动统计交易订单总金额,订单数及平均客单价. 然而,MySQL 的触发器的应用场合也十分有限,如果你使用过其他数据库产品的触发器

  • MySql数据库触发器使用教程

    目录 一.介绍 二.操作 1.表数据准备 2.触发器格式 3.操作 三.触发器NEW和OLD的使用 1.案例 四.其他操作 五.注意事项 补充:验证触发器 总结 一.介绍 1.触发器是一种特殊的存储过程.触发器和存储过程一样,是一个能够完成特定功能.存储在数据库服务器上的SQL片段,但是触发器无语调用,当对数据库表中的数据执行DML操作时自动触发这个SQL片段的执行,无需手动调用. 2.在MySql中,只有执行insert,delete,update操作时才能触发触发器的执行 3.触发器的这种特

  • MySQL触发器的使用详解

    目录 1.为什么需要触发器 2.触发器概述 3.触发器的创建 3.1语法 3.2 案例演示 4.查看触发器 5.删除触发器 总结 1.为什么需要触发器 有一些表是互相关联的,比如说商品表和库存表,我们对商品表的数据进行操作,那么对应的库存表还得发生变化,这样才可以保证数据的完整.如果我们是自己手动维护的话,比较麻烦. 这个时候我们可以使用触发器,创建一个触发器,让商品信息数据的插入操作自动触发库存数据的插入操作等,这样我们就不需要担心因为忘记添加库存数据而导致数据丢失了. 2.触发器概述 MyS

  • MySQL触发器使用详解

    MySQL包含对触发器的支持.触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行. 创建触发器 在MySQL中,创建触发器语法如下: 复制代码 代码如下: CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt 其中: trigger_name:标识触发器名称,用户自行指定: trigger_tim

  • MySQL触发器运用于迁移和同步数据的实例教程

    1.迁移数据 进行数据库移植,SQL Server=>MySQL.SQL Server上有如下的Trigger SET QUOTED_IDENTIFIER ON GO SET ANSI_NULLS ON GO ALTER TRIGGER [trg_risks] ON dbo.projectrisk FOR INSERT, UPDATE AS BEGIN UPDATE projectrisk SET classification = case when calc>= 9 then 3 when

  • MySQL 触发器详解及简单实例

    MySQL 触发器简单实例 语法 CREATE TRIGGER <触发器名称>  --触发器必须有名字,最多64个字符,可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象. { BEFORE | AFTER }  --触发器有执行的时间设置:可以设置为事件发生前或后. { INSERT | UPDATE | DELETE }  --同样也能设定触发的事件:它们可以在执行insert.update或delete的过程中触发. ON <表名称>  --触发器是属于某一个表

  • mysql 触发器用法实例详解

     MySQL触发器语法详解: 触发器 trigger是一种特殊的存储过程,他在插入(inset).删除(delete)或修改(update)特定表中的数据时触发执行,它比数据本身标准的功能更精细和更复杂的数据控制能力.触发器不是由程序调用,而是由某个事件来触发的.在有数据修改时自动强制执行其业务规则,经常用于加强数据的完整性约束和业务规则等.触发器可以查询其他表,而且包含复制的sql语句.触发器也可用于强制引用完整性.触发器可以强制比用check约束定义的约束更为复杂的约束. (一).CREAT

  • MySQL触发器概念、原理与用法详解

    本文实例讲述了MySQL触发器概念.原理与用法.分享给大家供大家参考,具体如下: 1.触发器的概念 触发器(trigger)是MySQL提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作(insert,delete, update)时就会激活它执行.--百度百科 上面是百度给的触发器的概念,我理解的触发器的概念,就是你执行一条sql语句,这条sql语句的执行会自动去触发执行其他的s

  • MySQL 触发器定义与用法简单实例

    本文实例讲述了MySQL 触发器定义与用法.分享给大家供大家参考,具体如下: 语法 CREATE TRIGGER 触发器名称  --触发器必须有名字,最多64个字符,可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象. { BEFORE | AFTER }  --触发器有执行的时间设置:可以设置为事件发生前或后. { INSERT | UPDATE | DELETE }  --同样也能设定触发的事件:它们可以在执行insert.update或delete的过程中触发. ON 表名称

  • Mysql触发器在PHP项目中用来做信息备份、恢复和清空

    案例: 通过PHP后台代码可以将员工的信息删除,将删除的员工信息进行恢复(类似于从回收站中恢复员工信息),并且还可以将已经删除的员工进行清空(类似于清空回复站的功能). 思路: 要有一张员工表,还要有一张员工备份表:备份,使用触发器,在点击删除按钮执行删除功能之前将员工表中的信息导入到备份表中,这样就达到了备份的效果:恢复,对备份表使用触发器,将备份表中的数据删除,删除的同时将此数据导入到员工表中:清空,使用truncate方法,将备份表中的数据彻底清空,并且释放内存,而且这个方法进行数据删除不

  • MySQL触发器简单用法示例

    本文实例讲述了MySQL触发器简单用法.分享给大家供大家参考,具体如下: mysql触发器和存储过程一样,是嵌入到mysql的一段程序,触发器是由事件来触发的,这些事件包括,INSERT,UPDATE,DELETE,不包括SELECT 创建触发器 CREATE TRIGGER name,time,event ON table_name FOR EACH ROW trigger_stmt 例如 复制代码 代码如下: CREATE TRIGGER ins_sum BEFORE INSERT ON a

  • mysql触发器简介、创建触发器及使用限制分析

    本文实例讲述了mysql触发器简介.创建触发器及使用限制.分享给大家供大家参考,具体如下: 简介 SQL触发器是存储在数据库目录中的一组SQL语句.每当与表相关联的事件发生时,即会执行或触发SQL触发器,例如插入,更新或删除.SQL触发器也可以当做是一种特殊类型的存储过程. 它是特别的,因为它不像直接像存储过程那样调用. 触发器和存储过程之间的主要区别在于,当对表执行数据修改事件时,会自动调用触发器,而存储过程必须要明确地调用. 完事我们来看下SQL触发器的优点: SQL触发器提供了检查数据完整

  • mysql触发器原理与用法实例分析

    本文实例讲述了mysql触发器原理与用法.分享给大家供大家参考,具体如下: 本文内容: 什么是触发器 创建触发器 单条触发器语句 多条触发器语句 查看触发器 删除触发器 触发器的新旧记录引用 首发日期:2018-04-14 什么是触发器: 触发器用来在某些操作之后,"自动"执行一些操作.(比如插入了新的学生信息,那么在班级表中应该修改学生数). 当insert delete update设置触发器之后,执行insert delete update操作就会自动触发设置的内容. 一张表最大

  • mysql 触发器创建与使用方法示例

    本文实例讲述了mysql 触发器创建与使用方法.分享给大家供大家参考,具体如下: 什么是触发器 触发器用来在某些操作之后/之前,"自动"执行一些操作.(比如插入了新的学生信息,那么在班级表中应该修改学生数). 当insert delete update设置触发器之后,执行insert delete update操作就会自动触发设置的内容. 一张表最大能有6个触发器(3*2,三种操作*两种时间(before|after)). 创建触发器  语法: create trigger 触发器名

随机推荐