MySQL触发器trigger详解
- 2017-03-23 10:11:19
- 运维
- 37
- shevechco
触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性。
举个例子,比如你现在有两个表【用户表】和【日志表】,当一个用户被创建的时候,就需要在日志表中插入创建的log日志,如果在不使用触发器的情况下,你需要编写程序语言逻辑才能实现,但是如果你定义了一个触发器,触发器的作用就是当你在用户表中插入一条数据的之后帮你在日志表中插入一条日志信息。当然触发器并不是只能进行插入操作,还能执行修改,删除。
创建触发器
1.语法
drop trigger if exists databaseName.tri_Name; create trigger tri_Name -- tri_Name代表触发器名称 tirgger_time trigger_event on tableName -- tirgger_time为触发时机,可选值有after/before,trigger_event为触发事件,可选值有insert/update/delete for each row -- 这句话在mysql是固定的,表示任何一条记录上的操作满足触发事件都会触发该触发器。 begin sql语句; end
①insert类型触发器
drop trigger if exists study.tgr_users_insert; create trigger tgr_users_insert before insert on users for each row begin set new.username='fanqi'; -- NEW用来表示将要(before)或已经(after)插入的新数据。 end;
drop trigger if exists study.tgr_users_delete; create trigger tgr_users_delete before delete on users for each row begin declare oldusername varchar(20) default 'fan'; set oldusername = old.username; -- old用来表示将要或已经被删除的原数据。 end;
drop trigger if exists study.tgr_users_update; create trigger tgr_users_update before update on users for each row begin declare oldusername varchar(20) default 'fan'; set oldusername = old.username; -- old用来表示将要或已经被修改的原数据 set new.username= concat(oldusername,new.username); -- new用来表示将要或已经修改为的新数据 end;
show triggers from databaseName;
⒋删除触发器
drop trigger if exists databaseName.tri_Name;
触发器是基于行触发的,所以删除、新增或者修改操作可能都会激活触发器,所以不要编写过于复杂的触发器,也不要增加过得的触发器,这样会对数据的插入、修改或者删除带来比较严重的影响,同时也会带来可移植性差的后果,所以在设计触发器的时候一定要有所考虑。
触发器是一种特殊的存储过程,它在插入,删除或修改特定表中的数据时触发执行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力。
数据库触发器有以下的作用:
1.安全性。可以基于数据库的值使用户具有操作数据库的某种权利。
可以基于时间限制用户的操作,例如不允许下班后和节假日修改数据库数据。
可以基于数据库中的数据限制用户的操作,例如不允许股票的价格的升幅一次超过10%。
2.审计。可以跟踪用户对数据库的操作。
审计用户操作数据库的语句。
把用户对数据库的更新写入审计表。
3.实现复杂的数据完整性规则
实现非标准的数据完整性检查和约束。触发器可产生比规则更为复杂的限制。与规则不同,触发器可以引用列或数据库对象。例如,触发器可回退任何企图吃进超过自己保证金的期货。
提供可变的缺省值。
4.实现复杂的非标准的数据库相关完整性规则。触发器可以对数据库中相关的表进行连环更新。例如,在auths表author_code列上的删除触发器可导致相应删除在其它表中的与之匹配的行。
在修改或删除时级联修改或删除其它表中的与之匹配的行。
在修改或删除时把其它表中的与之匹配的行设成NULL值。
在修改或删除时把其它表中的与之匹配的行级联设成缺省值。
触发器能够拒绝或回退那些破坏相关完整性的变化,取消试图进行数据更新的事务。当插入一个与其主健不匹配的外部键时,这种触发器会起作用。例如,可以在books.author_code 列上生成一个插入触发器,如果新值与auths.author_code列中的某值不匹配时,插入被回退。
5.同步实时地复制表中的数据。
6.自动计算数据值,如果数据的值达到了一定的要求,则进行特定的处理。例如,如果公司的帐号上的资金低于5万元则立即给财务人员发送警告数据。
内容版权声明:除非注明,否则皆为本站原创文章。
转载注明出处:http://www.sulao.cn/post/327
相关推荐
- mysql8登录报错Host '127.0.0.1' is not allowed to connect...
- python使用peewee(ORM)操作mysql数据库
- MySQL CPU占用过高的排查方法
- docker-compose编排lnmp(nginx+php+mysql)环境
- docker和docker-compose分别部署mysql5.7
- centos7编译安装mysql8
- mysql8修改密码正确方式
- windows系统上mysql8免装版安装教程
- zabbix4.4使用自定义监控脚本监控mysql
- Centos7下编译安装lnmp环境(nginx1.18.0+mysql5.7.44+php7.4.33)