触发器:trigger,是用户定义在关系表上的一类由事件驱动的特殊过程,触发器在被定义以后,保存在数据库服务器,任何用户对表的操作,服务器都会自动激活该触发器。
触发器又叫做:事件-条件-动作规则
即事件发生->检查条件->执行动作(如果条件满足)
其实就是事先为某张表绑定好一段代码,当对表进行某种操作(增删改)的时候,系统会自动触发代码执行。
#触发器只能定义在基本表上(视图不支持),且只有创建表的用户才可以在表上定义触发器。
#触发时间:after指在触发事件的操作执行之后激活触发器,before是之前
#触发事件:可以是 insert delete update,也可以是几个事件的组合
#触发对象:可分为行级触发器,和语句级触发器,指明触发动作的间隔
触发器的执行由触发事件激活,并由数据库服务器自动执行,一个数据表上可能定义了多个触发器(有三种操作,两种执行时间,所以最多六种)
1执行该表上的before触发器
2激活触发器的sql语句
3执行该表上的after语句
(这三个动作是一个顺序的动作,任何一个动作失败,后面的动作都不会再执行)
创建触发器:
从逻辑的完备上来讲我们需要给出触发器的名字,需要关联的是哪张表,要响应什么活动,在什么时候响应。
create trigger 触发器名字 触发事件 事件类型 on 表名
for each row / statement
[when 触发条件]
begin
触发器内容
end
(只有一条语句的时候,可省略begin..end)
触发器记录:
系统会将当前要操作的记录的当前状态保存到old中,操作之后的可能状态保存到new
(new就是事件之后的新值,old就是事件之前的旧值)
(删除的时候是没有new的,插入的时候没有old)(因为插入之前,删除之后什么都没有嘛)
( 可以用referencing 来对new old 改名)
删除触发器:
drop trigger <触发器名> on <表名>;
(触发器不能更新或覆盖,要修改一个触发器,必须先删除它,然后再重新创建)
举个栗子:
对SC表的grade属性修改的时候,若分数增加了10%,则将此操作记录到SC_U表
create trigger SC_T
after update of Grade on SC
for each row
when(new.grade >= 1.1* old.grade)
insert into SC_U(Sno,Cno,OldGrade,NewGrade)
values(old.Sno,old.Cno,old.Grade,new.Grade)
再举一个栗子:
为教师表Teacher定义完整性规则"教授的工资不得低于4000元,如果低于4000元,自动改为4000元"
create trigger Insert_Or_Update_Sal
before insert or update on Teacher
for each row
begin
if(new.Job='教授')and(new.Sal<4000)
then new.Sal := 400;
end if;
end;
这个例子也很好理解,但是运用到了对多种操作定义触发器,begin..end语句组,if语句,赋值语句
但是在mydql环境下赋值语句 := 测试时失败 改成 set new.Job='教授' 通过
注意:delimiter经常与begin end 搭配出现,因为需要更换语句结束符,让begin end里面的多条语句能用分号结束而不使整条命令结束