一. 实验目的 1. 理解触发器的作用和工作机制; 2. 掌握某一具体DBMS的SQL编程语言,在前面创建的数据库基础上,定义BEFORE触发器和AFTER触发器,并验证设计的触发器是否起作用。
二. 实验内容 1. 触发器的设计; 2. 触发器正确性验证。
三. 实验要求、过程及结果 设计一个触发器,实现如下功能:在Student中, 当删除某一同学S#时,该同学的所有选课也都要删除; 完成触发器的创建
假设Student表中某一学生要变更其主码S#的值,如使其原来的98030101变更为99030131, 此时sc表中该同学已选课记录的S#也需自动随其改变。
设计一个触发器完成上述功能; 完成触发器的创建并执行更新操作
设计一个触发器:当进行Teacher表更新元组时, 使其工资只能升不能降; 完成触发器创建及检验 工资低于原工资时无法更新
建立CourSum(S#, Sname, SumCourse)表,其中属性SumCourse统计该同学已学习课程的门数,初始值为0,以后每选修一门都要对其增1。
设计一个触发器自动完成上述功能; 完成触发器的创建以及插入操作,看后续是否能计数
成功完成对每位同学的选课计数,再次插入单条选课记录,看是否能完成计数
设计一个触发器,实现以下功能:Dept(D#, Dname, Dean)表中Dean对应的教师,一定是该系教师Teacher(T#, Tname, D#, Salary)中工资最高的教师。
附:实验源码 1.create trigger shanchu on student for delete as delete SC from student,deleted where SC.S#=deleted.sno delete from student where student.sno=98030101 2.create trigger gengxin on student for update as if update(sno) update SC set SC.S#=inserted.sno from SC,deleted,inserted where SC.S#=deleted.sno update student set sno=12345678 where sno=98030101 3.create trigger jiaxin on teacher for update as begin declare @x int declare @y int select @x=Salary from inserted select @y=Salary from deleted if(@x<@y) begin print ‘工资小于原工资,不行’ rollback transaction end else print ‘nice!’ End 4.create trigger jilu on SC for insert as declare @x char(10) declare @y char(10) select @x=S# from inserted select @y=C# from inserted declare @Sumcourse int select @Sumcourse=count(*) from SC where S#=@x insert coursum select S#=@x,C#=@y,Sumcourse=@Sumcourse 5.create trigger xizhurenNB on teacher for insert as begin declare @z char(10) select @z=D# from inserted declare @x int select @x=Salary from inserted declare @y int select @y=Salary from teacher,Dept where Dept.Dean=teacher.Tname and @z=teacher.D# if(@x>@y) begin print’***觉得工资不能大于系主任’ rollback transaction end end
