(1)实验目的数据库
掌握数据库触发器的设计和使用方法spa
(2)实验内容和要求设计
定义BEFORE触发器和AFTER触发器。可以理解不一样类型触发器的做用和执行原理,验证触发器的有效性。3d
(3)实验重点和难点code
实验重点:触发器的定义。blog
实验难点:利用触发器实现较为复杂的用户自定义完整性。get
这次实验仍是延用理论课本中出现的大学数据库做为实验例子。it
(1). AFTER触发器io
i. 在takes表上定义一个UPDATE触发器,当takes表中元组的属性grade被更新时,意味着学生上的这么课的课程成绩被更新,须要用触发器维护student里元组的tot_cred属性,使其得到的总学分保持实时更新。只有当属性grade从空值或者’F’被更新为表明课程已经完成的具体分数时,触发器才会被激发。class
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;
ii. 在section表上定义一个INSERT触发器,当对课程section表执行任何插入操做后触发器被启动,以确保插入元组的time_slot_id属性即上课时间段是合法的,受time_slot表的time_slot_id约束,检查插入时的参照完整性。
delimiter
create trigger timeslot_check1 after insert on section for each row begin if(NEW.time_slot_id not in (select time_slot_id from time_slot)) then delete from section where time_slot_id = NEW.time_slot_id; end if; end
iii. 在time_slot表上定义一个DELETE触发器,当删除的元组的time_slot_id不在删除后的time_slot表中时,且section中存在包含这个time_slot_id 值的元组时,触发器被启动,以确保time_slot中发生删除时,section的参照完整性。
delimiter
create trigger timeslot_check2 after delete on time_slot for each row begin if(OLD.time_slot_id not in (select time_slot_id from time_slot) and OLD.time_slot_id in (select time_slot_id from section)) then insert into time_slot values(OLD); end if; end
iv. 验证定义在takes表上的AFTER UPDATE触发器
初始时编号999的学生在493这门课成绩为F,即不经过,没法得到学分:
且其已获学分为15:
假设补考事后其成绩为B,需更新takes:
定义在takes表上的UPDATE触发器触发,此时学生的总学分应该增长:
从上图能够看到UPDATE触发器触发成功。
(2). BEFORE触发器
Before触发器的update,insert,delete语句语法和after触发器基本相似,故此下面再也不赘述所有三种语句,只拿BEFORE INSERT触发器作为例子。
i. 在takes表上定义一个before insert触发器,插入一条记录时,假设所插入的分数的
值为空白则代表该分数发生缺失,因此定义此触发器在分数值条件知足时触发用null值代替空白。
delimiter
create trigger setnull before insert on takes for each row begin if(NEW.grade = ' ') then set NEW.grade = null; end if; end
ii. 验证定义在takes表上的BEFORE INSERT触发器
初始时:
编号为999的学生只有一门课
假设该学生如今上了另外一门课,插入元组,且该课程成绩缺失还没给出:
查看该学生所上课程的信息:
从上表能够看出takes表上的BEFORE INSERT触发器触发成功。
iii. 删除触发器
drop trigger setnull;
总结:
after触发器—是在记录操纵以后触发,是先完成数据的增删改,再触发,触发的语句晚于监视的增删改操做,没法影响前面的增删改动做
before触发器—是在记录操纵以前触发,是先完成触发,再增删改,触发的语句先于监视的增删改,咱们就有机会判断,修改即将发生的操做,如:咱们在触发以前须要判断new值和old值的大小或关系,若是知足要求就触发,不经过就修改再触发;如:表之间定义的有外键,在删除主键时,必需要先删除外键表,这时就有前后之分,这里before至关于设置了断点,咱们能够处理删除外键。
对于INSERT语句, 只有NEW是合法的;
对于DELETE语句,只有OLD才合法;
对于UPDATE语句,NEW、OLD能够同时使用。