一、实验目的和要求 掌握数据库编程及触发器的实现方法。 |
|
二、教学要求 1.掌握基本的数据库编程知识(变量使用和分支语句); 2.了解触发器的使用方法; 3.了解inserted逻辑表和deleted逻辑表的使用; 4.掌握DML触发器的创建方法; 5.理解用触发器能够实现数据完整性的原理。 |
|
三、实验内容 在Student_DB中做如下操作: (1)查询学号为201215121的姓名和所选修的课程门数,当门数为2门及以上时,则输出“XX,已经完成了选课”,否则输出“XX,还需选课”。(提示:需定义变量存储选修的课程门数和学生姓名) (2)在数据库中查找姓名为“张立”的学生,若找到,输出该学生的学号,姓名,年龄,院系,否则,输出“查无此人”的信息。(提示:用if exists) (3)在Student表上创建一个触发器,每次有插入操作时,都设置变量@str的值为"Trigger is working",并输出显示出来。 (4)按课本P166页的方式创建TEACHER表(在此之前需创建DEPT表)。并在此教师表中定义一个AFTER触发器,为教师表Teacher定义完整性规则“教授的工资不得低于4000元,如果低于4000元,自动改为4000元”。并进行触发器的验证。 (5)首先解除Student表和SC表的参照关系。然后在Student表上创建一个触发器,使更新一个学生的学号信息时能够级联的更新此学生在SC表中的选课记录的学号信息,并进行验证。 (6)首先解除Student表和SC表的参照关系。然后在Student表上创建一个触发器,使删除一个学生时能够级联的删除此学生在SC表中的选课记录,并进行验证。
|
|
四 、 实 验 过 程
|
实验过程、存在的问题及解决办法: (1)查询学号为201215121的姓名和所选修的课程门数,当门数为2门及以上时,则输出“XX,已经完成了选课”,否则输出“XX,还需选课”。(提示:需定义变量存储选修的课程门数和学生姓名) use Student_10 begin declare @name char(10),@num int select @name=Student.Sname,@num=COUNT(Cno) from Student,SC where Student.Sno=SC.Sno and Student.Sno='201215121' group by Sname if(@num>=2) print @name+',已经完成选课' else print @name+',还需选课' End (2)在数据库中查找姓名为“张立”的学生,若找到,输出该学生的学号,姓名,年龄,院系,否则,输出“查无此人”的信息。(提示:用if exists) begin if exists( select Sno,Sname,Sage,Sdept from Student where Sname='张立') select Sno,Sname,Sage,Sdept from Student where Sname='张立' else print '查无此人' End (3)在Student表上创建一个触发器,每次有插入操作时,都设置变量@str的值为"Trigger is working",并输出显示出来。 create trigger tril on student after insert as begin declare @str char(20) set @str='Trigger is working' print @str End 测试: insert into student values('201215126','张三','男','19','CS') (4)按课本P166页的方式创建TEACHER表(在此之前需创建DEPT表)。并在此教师表中定义一个AFTER触发器,为教师表Teacher定义完整性规则“教授的工资不得低于4000元,如果低于4000元,自动改为4000元”。并进行触发器的验证。 create table DEPT( Deptno numeric(2), Dname char(9) unique not null, Location char(10), primary key(Deptno) )
create table TEACHER( Eno numeric(4) primary key, Ename char(10), Job char(8), Sal numeric(7,2), Deduct numeric(7,2), Deptno numeric(2), constraint TeacherFkey foreign key(Deptno) references DEPT(Deptno), constraint C1 check(sal+Deduct>=3000) ) create trigger trilte on teacher after insert,update as begin declare @job char(8),@sal numeric(7,2),@eno numeric(4) select @job=job,@sal=sal,@eno=eno from inserted if(@job='教授' and @sal<4000) update teacher set sal='4000' where Eno=@eno End insert into teacher(Eno,sal,job) values('100','2000','教授') select * from teacher where Eno='100' (5)首先解除Student表和SC表的参照关系。然后在Student表上创建一个触发器,使更新一个学生的学号信息时能够级联的更新此学生在SC表中的选课记录的学号信息,并进行验证。 create trigger st_sc on student after update,insert as begin declare @new char(9),@old char(9) select @new=sno from inserted select @old=sno from deleted update sc set sno=@new where sno=@old End update student set sno='2020' where sno='201215121' select * from student where Sno='2020' select * from sc where sno='2020' (6)首先解除Student表和SC表的参照关系。然后在Student表上创建一个触发器,使删除一个学生时能够级联的删除此学生在SC表中的选课记录,并进行验证。 create trigger del on student after delete as begin declare @Sno char(9) select @Sno=sno from deleted delete from sc where sno=@sno End delete from student where Sno='2020' select * from student select * from sc |
五、实 验 总 结 |