【MySQL思考】触发器是否应该在生产环境中使用?

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 【MySQL思考】触发器是否应该在生产环境中使用?

[1] 触发器简单介绍


  MySQL 触发器trigger是一种存储程序,它和一个指定的表相关联,当该表中的数据发生变化(增加、更新、删除)时自动执行。 这些修改数据行的操作被称为触发器事件,例如insert或者load data等插入数据的语句可以激活插入触发器。

  按照 SQL 标准,触发器可以分为行级触发器row-level trigger和语句级触发器statement-level trigger。行级触发器对于修改的每一行数据都会激活一次,如果一个语句插入了 100 行数据,将会调用触发器 100 次;语句级触发器针对每个语句激活一次,一个插入 100 行数据的语句只会调用一次触发器。MySQL只支持行级触发器,不支持预语句级触发器。

  不同事件可以激活不同类型的触发器。INSERT事件触发器用于插入数据的操作,包括 INSERTLOAD DATAREPLACE语句等;UPDATE事件触发器用于更新操作,例如UPDATE句;DELETE事件触发器用于删除操作,例如DELETEREPLACE语句等,DROP TABLETRUNCATE TABLE语句不会激活删除触发器。

  另外,MySQL触发器可以在触发事件之前或者之后执行,分别称为BEFORE触发器和AFTER 触发器。这两种触发时机可以和不同的触发事件进行组合,例如BEFORE INSERT触发器或者AFTER UPDATE触发器。

[2] 触发器的优点


  记录并审核用户对表中数据的修改操作,实现审计功能;

  实现比检查约束更复杂的完整性约束,例如禁止非业务时间的数据操作;

  实现某种业务逻辑,例如增加或删除员工时自动更新部门中的人数;

  同步实时地复制表中的数据。

[3] 触发器的缺点:


触发器会增加数据库结构的复杂度,而且触发器对应用程序不可见,难以调试;


触发器需要占用更多的数据库服务器资源,尽量使用数据库提供的非空、唯一、检查约束等;


触发器不能接收参数,只能基于当前的触发对象进行操作。


针对特殊场景使用触发器可以带来一定的便利性;但不要过渡依赖触发器,避免造成数据库的性能下降和维护困难。接下来我们介绍触发器的管理操作。

[4] 触发器在生产环境中如何使用?


 触发器可以做一些“酷”的事情,但是在真正大规模的生产环境中,它们会导致许多问题:

会导致难以追踪的性能问题。


 触发器在数据库中嵌入了相当于应用程序逻辑的内容,应该被视为事实上的应用程序代码,这可能会触发极难追踪的错误。


 触发器的一个古老用例是用于各种类型的安全性,比如不允许人们在对雇员表的查询中看到CEO的薪水。然而,这样的“黄金记录”很少见,可以使用模式设计和现有的SQL授权规则来处理。

  在非常大的数据世界中:

  · 没有触发器。

  · 没有视图。

  以上是为了让我们在处理性能问题时保持绝对的清晰。

  存储过程仅用于数据库实用程序功能,而不是应用程序逻辑。


  当触发器的使用是合理的时,使用触发器是非常有效的。例如,它们在审计(保存数据的历史)方面有很好的价值,而不需要对每个表上的每个CRUD命令都有明确的过程代码。

  触发器能够在数据更改之前和之后进行控制。这允许进行验证和业务安全检查。由于这种类型的控件,可以在插入数据库之前和之后执行诸如列格式化之类的任务。

  只有在真正需要的时候才使用触发器,如果可能的话,选择使用存储过程。

可能这其中的一些原因是:


 过去触发器执行的一些功能现在可以用其他方式执行,如更新总计和自动计算列。


 在不知道代码存在的情况下,只检查代码看不到触发器在哪里被调用。当看到数据发生变化时,就会看到它们的影响,并且有时很难弄清楚为什么会发生变化,除非知道有一个触发器或更多的设置在表上。

  如果在几个表上使用几个数据库控件,如CHECKRITriggers,那么事务详细流程将变得难以理解和维护。需要确切地知道什么时候会发生什么。同样,需要很好的文档。

[5] 触发器和非触发器存储过程之间的差异:


 非触发器存储过程类似于必须从代码、调度程序或批处理作业等中显式调用的程序。而触发器是一种特殊类型的存储过程,它作为事件的响应而触发,而不是由用户直接执行。例如,该事件可以是数据列中数据的变化。


 触发器有类型。DDL触发器和DML触发器(类型:INSTEAD OF、For和AFTER)


 非触发器存储过程可以引用任何类型的对象,但是,要引用视图,必须使用INSTEAD OF触发器。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5天前
|
存储 SQL 关系型数据库
MySQL数据库进阶第四篇(视图/存储过程/触发器)
MySQL数据库进阶第四篇(视图/存储过程/触发器)
|
9天前
|
存储 SQL 关系型数据库
MySQL周内训参照4、触发器-插入-修改-删除
MySQL周内训参照4、触发器-插入-修改-删除
10 1
|
10天前
|
SQL 存储 关系型数据库
MYSQL--触发器
MYSQL--触发器
|
12天前
|
存储 SQL 关系型数据库
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】(3)
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】
|
9天前
|
存储 SQL 关系型数据库
MySQL存储过程_触发器_游标——Baidu Comate
MySQL存储过程_触发器_游标——Baidu Comate
12 0
|
9天前
|
SQL 存储 关系型数据库
MySQL的触发器创建与使用——使用Baidu Comate生成与触发测试完整过程
MySQL的触发器创建与使用——使用Baidu Comate生成与触发测试完整过程
9 0
|
12天前
|
存储 关系型数据库 MySQL
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】(4)
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】
|
2天前
|
存储 关系型数据库 MySQL
关系型数据库mysql日志和临时文件
【6月更文挑战第15天】
20 4
|
2天前
|
存储 关系型数据库 MySQL
关系型数据库mysql数据文件存储
【6月更文挑战第15天】
9 4
|
2天前
|
存储 关系型数据库 MySQL
关系型数据库mysql文件系统支持
【6月更文挑战第15天】
19 4

热门文章

最新文章