数据库学习笔记和小练习(10)触发器

触发器: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)

这个很好理解,利用了查询条件和对某一行的update


 再举一个栗子:

为教师表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里面的多条语句能用分号结束而不使整条命令结束

你可能感兴趣的:(数据库)