0


MySQL的触发器

1. MySQL触发器的概念与作用

触发器概念:触发器是一种特殊的存储过程,它在试图更改触发器所保护的数据时自动执行。

触发器与存储过程的异同
相同点:1. 触发器是一种特殊的存储过程,触发器和存储过程一样是一个能够完成特定功能、存储在数据库服务器上的SQL片段。
不同点:2. 存储器调用时需要调用SQL片段,而触发器不需要调用,当对数据库表中的数据执行DML操作时自动触发这个SQL片段的执行,无需手动调用。

  • 在MySQL中,只有执行insert,delete,update操作时才能触发触发器的执行;
  • 触发器的这种特性可以协助应用在数据库端确保数据的完整性,日志记录,数据校验等操作;
  • 使用别名OLD和NEW来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。现在触发器还只支持行级触发,不支持语句级触发;

触发器的特性
在这里插入图片描述
触发器的作用

  1. 安全性。能够基于数据库的值使用户具有操作数据库的某种权利。
  • 能够基于时间限制用户的操作,比如不同意下班后和节假日改动数据库数据。
  • 能够基于数据库中的数据限制用户的操作,比如不同意股票的价格的升幅一次超过10%。
  1. 审计。能够跟踪用户对数据库的操作。
  • 审计用户操作数据库的语句。
  • 把用户对数据库的更新写入审计表。
  1. 实现复杂的数据完整性规则
  • 实现非标准的数据完整性检查和约束。触发器可产生比规则更为复杂的限制。与规则不同,触发器能够引用列或数据库对象。比如,触发器可回退不论什么企图吃进超过自己保证金的期货。
  • 提供可变的缺省值。
  1. 实现复杂的非标准的数据库相关完整性规则。触发器能够对数据库中相关的表进行连环更新。比如,在auths表author_code列上的删除触发器可导致对应删除在其他表中的与之匹配的行。
  • 在改动或删除时级联改动或删除其他表中的与之匹配的行。
  • 在改动或删除时把其他表中的与之匹配的行设成NULL值。
  • 在改动或删除时把其他表中的与之匹配的行级联设成缺省值。
  • 触发器可以拒绝或回退那些破坏相关完整性的变化,取消试图进行数据更新的事务。当插入一个与其主健不匹配的外部键时,这样的触发器会起作用。比如,可以在books.author_code 列上生成一个插入触发器,假设新值与auths.author_code列中的某值不匹配时,插入被回退。
  1. 同步实时地复制表中的数据。
  2. 自己主动计算数据值,假设数据的值达到了一定的要求,则进行特定的处理。比如,假设公司的帐号上的资金低于5万元则马上给財务人员发送警告数据。

1.1 创建触发器

在这里插入图片描述

createdatabaseifnotexists mydb01_trigger;use mydb01_trigger;-- 用户表createtableifnotexistsuser(
 uid intprimarykeyauto_increment,
 username varchar(50)notnull,
 password varchar(50)notnull)defaultcharset=utf8;-- 用户信息操作日志表createtableifnotexists user_logs(
 id intprimarykeyauto_increment,timetimestamp,
 log_text varchar(100))defaultcharset=utf8;-- 需求1:当user表添加一行数据,则会自动在user_log添加日志记录-- 定义触发器: trigger_test1createtrigger trigger_test1 afterinsertonuserfor each rowinsertinto user_logs values(NULL,now(),'new');-- 在user表添加数据,让触发器自动执行insertintouservalues(2,'zbb','123456');

1.2 触发器类型NEW和OLD的使用

在这里插入图片描述
在这里插入图片描述

createdatabaseifnotexists mydb01_trigger;use mydb01_trigger;-- 用户表createtableifnotexistsuser(
 uid intprimarykeyauto_increment,
 username varchar(50)notnull,
 password varchar(50)notnull)defaultcharset=utf8;-- 用户信息操作日志表createtableifnotexists user_logs(
 id intprimarykeyauto_increment,timetimestamp,
 log_text varchar(255))defaultcharset=utf8;-- 需求1:当user表添加一行数据,则会自动在user_log添加日志记录-- 定义触发器: trigger_test1createtrigger trigger_test1 afterinsertonuserfor each rowinsertinto user_logs values(NULL,now(),'new');-- 在user表添加数据,让触发器自动执行insertintouservalues(3,'zbb','123456');-- NEW和OLD-- insert 触发器-- NEW-- 定义触发器: trigger_test2droptrigger trigger_test1
createtrigger trigger_test2 afterinsertonuserfor each rowinsertinto user_logs values(NULL,now(),concat('有新用户添加,信息为:',NEW.username,NEW.password));insertintouservalues(4,'abb','123456');-- update 触发器-- NEW-- 定义触发器: trigger_test3-- OLDdroptrigger trigger_test2
createtrigger trigger_test3 afterupdateonuserfor each rowinsertinto user_logs values(NULL,now(),concat('有用户信息修改,旧数据是:',OLD.uid,OLD.username,OLD.password));updateuserset password ='00000'where uid=3;-- NEWdroptrigger trigger_test3
createtrigger trigger_test4 afterupdateonuserfor each rowinsertinto user_logs values(NULL,now(),concat('有用户信息修改:新数据是',NEW.uid,NEW.username,NEW.password));updateuserset password ='666666'where uid=3;-- delete类型触发器-- OLDcreatetrigger trigger_test5 afterdeleteonuserfor each rowinsertinto user_logs values(NULL,now(),concat('有用户被删除,删除信息为:',OLD.uid,OLD.username,OLD.password));deletefromuserwhere uid=3;

参考

https://www.cnblogs.com/mengfanrong/p/3851410.html
https://www.bilibili.com/video/BV1iF411z7Pu?p=126&spm_id_from=pageDriver


本文转载自: https://blog.csdn.net/A496608119/article/details/123277898
版权归原作者 莱维贝贝、 所有, 如有侵权,请联系我们删除。

“MySQL的触发器”的评论:

还没有评论