前言: sql
触发器只是用在特定的场合,通常状况下,咱们仍是在代码中处理,由于同一个业务逻辑中,若是代码和sql中都有业务逻辑,那么后期维护将很麻烦,因此要根据实际状况来选择,看是否合适。触发器就是写在数据库中的一个脚本sql,当数据库某一个字段发生改变的时候,触发一个或多条sql语句,同时让多张表的数据同步。好比咱们有的表中存放了部门名称,那么当咱们部门名称发生改变的时候,咱们应该调用触发器同时去修改存放了“部门名称”这个冗余字段。数据库
简单的说,就是一张表发生了某件事(插入、删除、更新操做),而后自动触发了预先编写好的若干条SQL语句的执行.安全
特色:触发事件的操做和触发器里的SQL语句是一个事务操做,具备原子性,要么所有执行,要么都不执行.spa
做用:1.安全性。能够基于数据库的值使用户具备操做数据库的某种权利。
2.审计。能够跟踪用户对数据库的操做。
3.实现复杂的非标准的数据库相关完整性规则。触发器能够对数据库中相关的表进行连环更新。触发器可以拒绝或回退那些破坏相关完整性的变化,取消试图进行数据更新的事务。当插入一个与其主健不匹配的外部键时,这种触发器会起做用。
4.同步实时地复制表中的数据。
5.自动计算数据值,若是数据的值达到了必定的要求,则进行特定的处理。
设计
1.增长程序的复杂度,有些业务逻辑在代码中处理,有些业务逻辑用触发器处理,会使后期维护变得困难.事件
2.若是须要变更整个数据集而数据集数据量又较大时,触发器效果会很是低.事务
3.对于批量操做并不适合使用触发器 使用触发器实现的业务逻辑在出现问题时很难进行定位,特别是设计到多个触发器的状况 协同开发时,写业务层代码若是不清楚数据库 触发器的细节,容易搞不清到底触发了那些触发器 大量使用触发器会致使代码结构容易被打乱,阅读源码困难.开发
CREATE TRIGGER trigger_name
trigger_time
trigger_event ON tbl_name
FOR EACH ROW
trigger_stmt同步
trigger_name:用来表示触发器的名称,能够本身设计
trigger_time:标识触发器的触发时机,取值是BEFORE或AFTER
trigger_event:标识触发事件,取值为INSERT,UPDATE和DELETE
tbl_name:标识创建触发器的表名,即在哪张表上创建触发器
trigger_stmt:触发器程序体,能够是一句SQL语句,或者用 BEGIN 和 END 包含的多条语句。
因而可知,能够创建6种触发器,即:BEFORE INSERT、BEFORE UPDATE、BEFORE DELETE、AFTER INSERT、AFTER UPDATE、AFTER DELETE。
不能在一个表中建两个相同类型的触发器,因此一个表最多只能建6个触发器;源码
SHOW TRIGGERS [FROM schema_name];
这里的schema_name 就是指定的库名
DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name
触发器不能修改, 只能删除之后从新建立.
咱们创建的数据库通常都是 InnoDB 数据库,其上创建的表是事务性表,也就是事务安全的。这时,若SQL语句或触发器执行失败,MySQL 会回滚事务,有: ①若是 BEFORE 触发器执行失败,SQL 没法正确执行。 ②SQL 执行失败时,AFTER 型触发器不会触发。 ③AFTER 类型的触发器执行失败,SQL 会回滚