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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
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触发器。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
关系型数据库 MySQL 数据安全/隐私保护
MySQL8.0生产环境二进制标准安装
MySQL8.0生产环境二进制标准安装
|
9月前
|
监控 关系型数据库 MySQL
|
7月前
|
SQL 关系型数据库 MySQL
MySQL生产环境迁移至YashanDB数据库深度体验
这篇文章是作者将 MySQL 生产环境迁移至 YashanDB 数据库的深度体验。介绍了 YashanDB 迁移平台 YMP 的产品相关信息、安装步骤、迁移中遇到的各种兼容问题及解决方案,最后总结了迁移体验,包括工具部署和操作特点,也指出功能有优化空间及暂不支持的部分,期待其不断优化。
|
11月前
|
存储 安全 关系型数据库
2024 Mysql基础与进阶操作系列之MySQL触发器详解(21)作者——LJS[你个小黑子这都还学不会嘛?你是真爱粉嘛?真是的 ~;以后请别侮辱我家鸽鸽]
MySQL触发器的使用场景之数据完整性约束、如何具体创建person的日志表、触发器与存储过程的对比与选择、触发器的性能和注意事项等具体操作详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
关系型数据库 MySQL 数据安全/隐私保护
MySQL5.7生产环境二进制标准安装
MySQL5.7生产环境二进制标准安装
|
存储 关系型数据库 MySQL
MySQL 中的触发器数量之谜
【8月更文挑战第31天】
213 0
|
SQL 数据采集 关系型数据库
|
存储 SQL 关系型数据库
(十四)全解MySQL之各方位事无巨细的剖析存储过程与触发器!
前面的MySQL系列章节中,一直在反复讲述MySQL一些偏理论、底层的知识,很少有涉及到实用技巧的分享,而在本章中则会阐述MySQL一个特别实用的功能,即MySQL的存储过程和触发器。
297 0
|
存储 SQL 数据库
MySQL设计规约问题之为什么要避免使用存储过程、触发器和函数
MySQL设计规约问题之为什么要避免使用存储过程、触发器和函数
|
存储 SQL 关系型数据库
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】(2)
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】

热门文章

最新文章

推荐镜像

更多