实验项目
实验1 实验环境与操作流程
实验2 数据定义、查询与更新
实验3 基本表的定义、删除与修改
实验4 数据的插入、修改和删除
实验5 数据的查询
实验6 数据的视图
实验7 完整性语言
实验8 触发器
实验9 存储过程与函数
实验10 SQL语句1(创建、插入、查询)
实验11 SQL语句2(查询)
实验12 SQL语句3(视图、完整性、关系代数查询)
实验8 触发器
一、实验目的
1. 理解触发器的基本概念及分类;
2. 掌握触发器的基本操作。
二、实验要求
1. 掌握触发器的定义;
2. 熟练掌握触发器的基本操作。
三、实验内容
(参考课本5.7节)
(命令1:show triggers;查看触发器。)
(命令2:delimiter XXX设置分隔符为XXX。delimiter ;取消自己设置的分隔符。)
- 创建触发器:
- 导入备份:导入数据库student_course,以及基本表Student、Course、SC,以及其表中的数据。
- 创建触发器1:当对表SC的Grade属性进行修改时,若分数增加了10%。则将此次操作记录到另一个表SC_U(Sno、Cno、Oldgrade、Newgrade)中,其中Oldgrade是修改前的分数,Newgrade是修改后的分数,参考例5.21。
- 创建Teacher表:建立教师表TEACHER(Eno,Ename,Job,Sal,Deduct),参考例5.11。
- 创建触发器2:定义一个EEFORE行级触发器,为教师表Teacher定义完整性规则“教授的工资不得低于4000元,如果低于4000元,自动改成4000元”,参考例5.23。
- 验证触发器:
- 验证触发器1:修改SC表中学号为201215121的同学选修的3号课程的成绩,由88修改为90,查看是否激活了触发器。
- 验证触发器1:修改SC表中学号为201215122的同学选修的3号课程的成绩,由80修改为90,查看是否激活了触发器。
- 验证触发器2:向Teacher表插入一条记录(教职工号:2001,教职工名:张明,工作:副教授,工资项:3950,扣除项:58.2),查看是否激活了触发器。
- 验证触发器2:向Teacher表插入一条记录(教职工号:2002,教职工名:赵玲,工作:教授,工资项:3950,扣除项:58.2),查看是否激活了触发器。
- 删除上述两个触发器。
实验指导:
- 创建触发器:
- 导入备份:导入数据库student_course,以及基本表Student、Course、SC,以及其表中的数据。
- 创建触发器1:当对表SC的Grade属性进行修改时,若分数增加了10%。则将此次操作记录到另一个表SC_U(Sno、Cno、Oldgrade、Newgrade)中,其中Oldgrade是修改前的分数,Newgrade是修改后的分数,参考例5.21。
- 创建Teacher表:建立教师表TEACHER(Eno,Ename,Job,Sal,Deduct),参考例5.11。
- 创建触发器2:定义一个EEFORE行级触发器,为教师表Teacher定义完整性规则“教授的工资不得低于4000元,如果低于4000元,自动改成4000元”,参考例5.23。
- 验证触发器:
- 验证触发器1:修改SC表中学号为201215121的同学选修的3号课程的成绩,由88修改为90,查看是否激活了触发器。
(创建SC_U表,为了验证)
(未激活触发器)
- 验证触发器1:修改SC表中学号为201215122的同学选修的3号课程的成绩,由80修改为90,查看是否激活了触发器。
(激活触发器)
- 验证触发器2:向Teacher表插入一条记录(教职工号:2001,教职工名:张明,工作:副教授,工资项:3950,扣除项:58.2),查看是否激活了触发器。
(未激活触发器)
- 验证触发器2:向Teacher表插入一条记录(教职工号:2002,教职工名:赵玲,工作:教授,工资项:3950,扣除项:58.2),查看是否激活了触发器。
(激活触发器)
- 删除上述两个触发器。
实验8代码:
show triggers;
delimiter $$
create trigger SC_T
after update on SC
for each row
if(New.Grade>=1.1*Old.Grade)
then
insert into SC_U(Sno,Cno,OldGrade,NewGrade)
values(Old.Sno,Old.Cno,Old.Grade,New.Grade);
end if $$
delimiter ;
create table Teacher(Eno numeric(4) primary key,Ename char(10),Job char(8),Sal numeric(7,2),Deduct numeric(7,2));
delimiter $$
create trigger InRR
before insert on Teacher
for each row
begin
if(New.Job='教授') and (New.Sal<4000)
then
set New.Sal:=4000;
end if;
end $$
delimiter ;
create table SC_U(Sno char(9), Cno char(4),OldGrade smallint,NewGrade smallint);
update SC set Grade=90 where Sno='201215121' and Cno='3';
update SC set Grade=90 where Sno='201215122' and Cno='3';
insert into Teacher values('2001','张明','副教授',3950,58.2);
insert into Teacher values('2002','张明','教授',3950,58.2);
drop trigger SC_T;
drop trigger InRR;