您的位置:首页 > 数据库 > MySQL

数据库触发器相关(以mysql为例)

2017-02-24 13:47 246 查看
一.触发器概述

触发器是一个被置顶关联到一个表的数据库对象,当对一个表的特定事件出现时,它将会被激活。触发器简而言之就是在特定事件发生时会被触发从而达到管理者想要的效果。

例如:

每当客户订购一个产品时,都从产品库存量中减去订购的数量。

无论何时删除一行,都会在数据库的存档表中保留一个副本。

二.创建触发器

语法格式:

CREATE TRIGGER name time event

ON tb_name FOR EACH ROW body

语法说明如下:

name:触发器的名称,触发器在当前数据库必须有唯一的名称, 如果要在某个特定数据库中创建, 名称前应加上数据库的名称

time 触发器被触发的时刻有BEFORE和AFTER两个选项。用于表示触发器是在激活它的语句之前或者之后触发

如果希望验证新数据是否满足使用的限制, 则通常使用BEFORE触发

如果希望在触发之后完成几个乃至更多的改变,则通常使用AFTER触发

event 触发事件, 用于指定激活触发器的语句的种类。 目前MYSQL触发种类只有INSERT, UPDATE, DELETE三种。

tb_name 与触发器相关联的表名,必须引用永久性表,不能将触发器与临时表或视图关联起来

FOR EACH ROW 这个声明用来指定对于受触发事件影响的每一行都要激活触发器的动作。如使用INSERT向表中插入多条记录时,触发器对于每一行记录都会触发执行

body 触发器动作主体,包含触发器激活时要执行的MYSQL语句。

举例:如图所示在takes表上定义一个UPDATE触发器,当takes表中元组的属性grade被更新时,意味着学生上的这么课的课程成绩被更新,需要用触发器维护student里元组的tot_cred属性,使其获得的总学分保持实时更新。只有当属性grade从空值或者’F’被更新为代表课程已经完成的具体分数时,触发器才会被激发。

delimiter
create trigger credit_get after update
on takes for each row
begin
if (NEW.grade <> 'F' and NEW.grade is not null
and (OLD.grade = 'F' or OLD.grade is null))
then
update student
set tot_cred = tot_cred +
(select credits
from course
where course.course_id = NEW.course_id)
where student.ID = NEW.ID;
end if;
end;三.查看触发器
如需在数据库中查看已存在的触发器,可以使用如下语句

SHOW TRIGGERS [FROM|IN database.name]

四.删除触发器

DROP TRIGGER [IF EXISTS] [database.name] trigger_name

五. 关于触发器的进一步说明

与其他DBMS相比,目前MYSQL版本所支持的触发器还比较低级,未来肯定会有所改进

创建触发器可能需要特殊的安全访问权限,但是触发器的执行是自动的,也就是说如果INSERT, DELETE, 或UPDATE可以执行,那么触发器也可正常工作

应该多用触发器来保证数据的一致性,完整性和正确性。

触发器有一种十分有意义的使用模式——创建审计跟踪,即可以使用触发器将表的更改状态以及之前和之后的状态记录到另外一张数据表中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: