首页 > 数据库 >【MySQL思考】触发器是否应该在生产环境中使用?

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

时间:2023-01-16 18:04:21浏览次数:38  
标签:语句 触发器 数据库 存储 事件 思考 MySQL 数据


[1] 触发器简单介绍

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

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

  不同事件可以激活不同类型的触发器。​​INSERT​​​事件触发器用于插入数据的操作,包括 ​​INSERT​​​、​​LOAD DATA​​​、​​REPLACE​​​语句等;​​UPDATE​​​事件触发器用于更新操作,例如​​UPDATE​​​语句;​​DELETE​​​事件触发器用于删除操作,例如​​DELETE​​​和​​REPLACE​​​语句等,​​DROP TABLE​​​和​​TRUNCATE TABLE​​语句不会激活删除触发器。

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

[2] 触发器的优点

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

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

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

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

[3] 触发器的缺点:

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

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

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

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

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

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

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

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

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

  在非常大的数据世界中:

  · 没有触发器。
  · 没有视图。

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

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


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

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

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

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

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

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

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

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

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

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

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


标签:语句,触发器,数据库,存储,事件,思考,MySQL,数据
From: https://blog.51cto.com/u_15942590/6010666

相关文章

  • MySQL 中的事务控制机制
    事务控制是MySQL的重要特性之一。在MySQL中,InnoDB和NDBCluster是常见的事务型存储引擎。1.自动提交默认情况下,MySQL是自动提交(autocommit)的。也就意味着:如果不......
  • mac虚拟环境Reason: tried: '/usr/local/lib/libmysqlclient.21.dylib' (no such file
    关于django链接数据库时,出现了找不到lib/libmysqlclient.21.dylib的问题。在网上百度了好久,终于用如下的命令解决了。版本信息虚拟环境python=3.7MYSQL=8.0.31mysqlc......
  • MySQL中的事务
    事务简介事务:是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。就比如:......
  • mysql主从同步失败 错误码1594
    起因某日mysql主从同步发生了错误,此时发现从库不再执行同步操作,于是在从库执行showslavestatus\G发现如下错误:上图中标红色的需要重点关注。解决办法之前出现其他常......
  • mysql8.0.30主从配置
    安装包下载地址:https://downloads.mysql.com/archives/community/1、解压介质包:#tarxfmysql-8.0.30-linux-glibc2.12-x86_64.tar.xz#mvmysql-8.0.30-linux-glib......
  • MySQL自定义排序ORDER BY FIELD
    在一些场景中,有场景A查询出一个已经排好顺序的id,需要到场景B中查询这些,使用mysql中的WHERE**IN(****),查询出来的结果并不是按照传入的list排序的.但是......
  • MySQL必知必会第十章-创建计算字段
    创建计算字段计算字段计算字段并不实际存在于数据库表中。计算字段是运行时在SELECT语句内创建的。字段(field)基本上与列(column)的意思相同,经常互换使用,不过数据库列一......
  • MySQL优化四,高性能优化
    一,查询优化器这个部分的整个过程是由MySQL的存储引擎来做的,优化器就会根据存储引擎来使用原来的开销,优化后的开销,哪个更好一点? 1.如果是查询语句(select语句),首先会查......
  • MySQL必知必会第九章-用正则表达式进行搜索
    用正则表达式进行搜索正则表达式介绍正则表达式是用来匹配文本的特殊的串(字符集合)。使用MySQL正则表达式MySQL用WHERE子句对正则表达式提供了初步的支持,允许你指定正则......
  • MySQL的多表查询
    多表关系项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三......