一.数据库触发器
SQL触发器是存储在数据库目录中的一组SQL语句。每当与表相关联的事件发生时,即会执行或触发SQL触发器,例如插入,更新或删除。SQL触发器也可以当做是一种特殊类型的存储过程。 它是特别的,因为它不像直接像存储过程那样调用。 触发器和存储过程之间的主要区别在于,当对表执行数据修改事件时,也就是开启一条事务的时候会自动调用触发器,简单的说,就是一张表发生了某件事(插入、删除、更新操作),然后自动触发了预先编写好的若干条SQL语句的执行
注:不能建立同一个事务的相同触发器,在一个表中最多建立6个触发器
二.为什么要使用触发器,它的优缺点
1.触发器的优点
1.安全性:可以基于数据库的值使用户具有操作数据库的某种权利
2.审计:可以跟踪用户对数据库的操作
3.同步实时地复制表中的数据
4.自动计算数据值,如果数据的值达到了一定的要求,则进行特定的处理
2.触发器的缺点
1.从客户端应用程序调用和执行SQL触发器不可见,因此很难弄清数据库层中发生的情况。也就是说,我们无法直观的看到触发器到底执行了什么操作
2.SQL触发器会增加数据库服务器的开销,从而影响性能
3.SQL触发器基于行触发,MySQL触发器始终时基于表中的一条记录触发,而不是一组SQL语句,如果需要变动整个数据集而数据集数据量又较大时,触发器效果会非常低
4.增加程序的复杂度,有些业务逻辑在代码中处理,有些业务逻辑用触发器处理,会使后期维护变得困难
注:不要过多的使用触发器,当我们无法使用存储过程完成工作时,可以考虑使用下SQL触发器
3.触发器特点及作用
特点:触发事件的操作和触发器里的SQL语句是一个事务操作,具有原子性,要么全部执行,要么都不执行
作用:保证数据的完整性,起到约束的作用
new:当触发插入和更新事件时可用,指向的是被操作的记录
old: 当触发删除和更新事件时可用,指向的是被操作的记录
4.触发器的限制和注意事项
1.触发程序不能调用将数据返回客户端的存储程序,也不能使用采用CALL语句的动态SQL语句,但是允许存储程序通过参数将数据返回触发程序,也就是存储过程或者函数通过OUT或者INOUT类型的参数将数据返回触发器是可以的,但是不能调用直接返回数据的过程。
2.不能再触发器中使用以显示或隐式方式开始或结束事务的语句,如START TRANS-ACTION,COMMIT或ROLLBACK。
注意事项:MySQL的触发器是按照BEFORE触发器、行操作、AFTER触发器的顺序执行的,其中任何一步发生错误都不会继续执行剩下的操作,如果对事务表进行的操作,如果出现错误,那么将会被回滚,如果是对非事务表进行操作,那么就无法回滚了,数据可能会出错。
三.哪种场景需要用到触发器
1.当向一张表中添加或删除记录时,需要在相关表中进行同步操作。比如,当一个订单产生时,订单所购的商品的库存量相应减少。
2.当表上某列数据的值与其他表中的数据有联系时。比如,当某客户进行欠款消费,可以在生成订单时通过设计触发器判断该客户的累计欠款是否超出了最大限度。
3.当需要对某张表进行跟踪时。比如,当有新订单产生时,需要及时通知相关人员进行处理,此时可以在订单表上设计添加触发器加以实现
四.触发器的使用
1.触发器的种类(在SQL Server 2005中,触发器可以分为两大类:DML触发器和DDL触发器)
DML触发器:DML触发器是当数据库服务器中发生数据操作语言(Data Manipulation Language)事件时执行的存储过程。DML触发器又分为两类:After触发器和Instead Of触发器
DDL触发器:DDL触发器是在响应数据定义语言(Data Definition Language)事件时执行的存储过程。DDL触发器一般用于执行数据库中管理任务。如审核和规范数据库操作、防止数据库表结构被修改等
2.创建触发器以及删除和查看的语法
语法: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
【查看触发器】
SHOW TRIGGERS
【删除触发器】
DROP TRIGGER 触发器名字
统一ti表中的数据然后新增到user表中
INSERT INTO USER SELECT COUNT(*),SUM(salary) FROM t1;
创建一个新增触发器 当t1表内容新增后user表会自动修改
CREATE TRIGGER t1_ai
AFTER INSERT ON t1
FOR EACH ROW
UPDATE USER SET
user_total = user_total+1,
salary_total = salary_total+new.salary;
创建一个删除触发器 当t1表删除数据后user表会自动修改
CREATE TRIGGER t1_ad
AFTER DELETE ON t1
FOR EACH ROW
UPDATE USER SET
user_total=user_total-1,
salary_total=salary_total-old.salary;
创建一个修改触发器 当t1表修改数据后user表会自动修改
CREATE TRIGGER t1_au
AFTER UPDATE ON t1
FOR EACH ROW
UPDATE USER SET
salary_total=salary_total-old.salary+new.salary;
删除触发器
DROP TRIGGER 触发器名字
查询所有触发器 选中具体的表在执行
SHOW TRIGGERS