实验六 触发器

版权声明:原创文章,未经许可不能转载 https://blog.csdn.net/qq_38499625/article/details/80380451

一、实验目的和要求

掌握数据库编程及触发器的实现方法。

二、教学要求

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

 

五、实

猜你喜欢

转载自blog.csdn.net/qq_38499625/article/details/80380451