实验八 存储过程和触发器_参考答案

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验八存储过程和触发器

一、目的与要求

1. 正确理解存储过程和触发器的概念、功能和类型;

2. 掌握使用SSMS和T-SQL语句创建和管理存储过程和触发器。

二、上机准备

利用教师提供的XSGL数据库,该库中有3个表:student,course,sc。

三、实验内容

1. 将教师提供的XSGL数据库附加到本地数据库中。

2. 分别使用SSMS和T-SQL语句创建和管理存储过程和触发器。

(1)创建一个存储过程proc_stud_sc_info,查询学号、姓名、性别、系、课程号和成绩等信息。

use xsgl

go

create procedure proc_stud_sc_info

as

select student.sno,sname,sex,dept,cno,grade

from student left join sc

on student.sno=sc.sno

go

(2)创建一个存储过程proc_stud_info,根据输入的学号,查询学生的基本信息。

use xsgl

go

create procedure proc_stud_info

@sno char(5)='95001'

as

select *

from student

where sno=@sno

go

(3)创建一个存储过程proc_stud_birth_year,根据输入的学生姓名,计算该学生的出生年份。

use xsgl

go

create procedure proc_stud_birth_year

@sname varchar(6)='张立'

as

select sname,year(getdate())-age as 出生年份

from student

where sname=@sname

go

(4)创建一个存储过程proc_GetAvgScByCno,根据输入的课程号返回该课程的平均成绩。

use xsgl

go

create procedure proc_GetAvgScByCno

@cno char(3)='1'

as

select @cno as 课程号,avg(grade) as 平均成绩

from sc

where cno=@cno

go

use xsgl

go

create procedure proc_GetAvgScByCno

@cno char(3)='1',@aver smallint output

as

select @aver=avg(grade)

from sc

where cno=@cno

go

(5)创建一个Insert触发器tri_StudentInsert,当向student表插入一条记录时,向客户端显示一条“您正在插入学生的数据”的信息。

create trigger tri_StudentInsert

on student for insert

as

print '您正在插入学生的数据'

go

--验证插入

--查看插入前状态

select * from student

--执行插入

insert into student values('95006','范冰冰','f',35,'IS')

--查看插入后状态

select * from student

(6)创建一个Update触发器tri_StudentUpdate,当修改student表的记录时,向客户端显示一条“原姓名与新姓名”的消息,并执行修改语句,验证触发器的运行。

create trigger tri_StudentUpdate

on student for update

as

begin

declare @oldname varchar(6),@newname varchar(6)

select @oldname=sname from deleted

select @newname=sname from inserted

print '原姓名为:'+@oldname+space(3)+'新姓名为:'+@newname

end

go

--验证更新

--查看更新前状态

select * from student

--执行更新

update student set sname='张小立' where sname='张立'

--查看更新前状态

select * from student

(7)创建一个Delete触发器tri_StudentDelete,当学生表的数据删除时,该数据被自动地增加到毕业生表(需要新建)中,并删除student表中的数据,并返回毕业生表中的数据,验证触发器的操作。

--创建毕业生表

create table grad_student

(sno char(5),sname varchar(6),sex char(1),age tinyint,dept char(2))

Go

--创建触发器

create trigger tri_StudentDelete

on student for delete

as

begin

declare @sno char(5),@sname varchar(6),@sex char(1),@age tinyint,@dept char(2)

if exists(select * from Deleted)

begin

select @sno=sno,@sname=sname,@sex=sex,@age=age,@dept=dept from Deleted

insert into grad_student values(@sno,@sname,@sex,@age,@dept)

end

end

go

--返回毕业生表中的数据,验证触发器的操作

delete from student where sname='范冰冰'

select * from grad_student

go

(8)创建一个Instead of触发器tri_ScInsert,当向sc表插入数据时,先检索student表和course表中是否有该同学以及该课程号的课程。如果没有,给出提示“学生表中没有该学号的同学!课程表中没有该课程号的课程”;有,则插入该数据,并执行插入语句测试触发器的动作。

create trigger tri_ScInsert

on sc

instead of insert

as

begin

declare @sno char(5),@cno char(3),@grade tinyint

select @sno=sno,@cno=cno,@grade=grade from inserted

if (not exists(select sno from student where sno=@sno)) and

(not exists(select cno from course where cno=@cno))

print '学生表中没有该学号的同学!课程表中没有该课程号的课程!'

else

if (exists(select sno from student where sno=@sno)) and

(exists(select cno from course where cno=@cno))

begin

insert into sc values(@sno,@cno,@grade)

print '已成功插入!'

end

end

--插入数据,测试触发器的动作。

insert into sc values('95002','3',null) --成功插入数据

相关文档
最新文档