数据库 实验五 触发器、存储过程操作实验


完全转发自:http://blog.sina.com.cn/s/blog_6ea6cd6a0100mp1n.html

一、实验目的和要求

(1)掌握 SQL Server中的触发器的使用方法;

(2)掌握存储过程的操作方法。

二、实验内容和原理

1. 基本操作实验

在读者-图书数据库中用Transact-SQL语句描述下列功能:

(1)在读者表上建立一个DELETE类型的触发器lianxi_del,触发动作是显示信息(已删除读者表中的数据),执行下列语句:

create trigger lianxi_del

on 读者

for delete

as print ‘已删除读者表中的数据’

(2)建立一个查询指定读者号的阅读信息的存储过程List_jy,输入参数为读者号,如果没有输入读者号,则要输出提示信息。建立这个存储过程的语句如下所示。

create procedure List_jy

@p_dzh char(5) = null

as

if @p_dzh is null

begin

print ‘请输入一个读者号’

return

end

else

select 编号,姓名,书名,借阅时间

from 读者,借阅,图书

where 读者.编号=借阅.读者编号 and 借阅.书号=图书.书号

and 读者.编号=@p_dzh

2. 提高操作实验

在学生-课程数据库中用Transact-SQL语句描述下列功能:

(1)为学生表建立一个名TRI_INSERT的INSERT触发器。功能是当用户向学生表添加数据时,同时也把这些数据添加到stu表中。其中:学生表和表stu的结构相同。

(2)为学生表建立一个名TRI_DELETE的DELETE触发器。功能是当用户从学生表删除数据时,同时把这些要删除的数据添加到stu表中。其中:表student和表stu的结构相同。

(3)创建一查询存储过程,过程名称为P_CX。参数是学号,输出信息是指定学号所应的姓名、课程名称、成绩。运行时若没有指定学号,则提示请输入学号;若学号不存在则提示学号不存在。

(4)创建一统计存储过程,过程名称为P_CJTJ。参数是学号,输出信息是指定学号的姓名、选课门数、平均分、总分、最高分、最低分。运行时若没有指定学号,则提示输入学号;若学号不存在则提示学号不存在。

(5)创建一个实现求1—n所有数之和的存储过程, 过程名称为P_SUM。参数是n,输出是前n个之和。如:n=100,则输出5050。

三、实验环境

硬件:计算机

软件:Windows 2000和SQL Server 2000

四、算法描述及实验步骤

1. 触发器的操作

(1)建立触发器

方法一:使用企业管理器

首先,打开企业管理器,定位数据库并找到要创建触发器的表;

然后,右击该表名,在弹出的快捷菜单中选择“设计表”,在打开的“设计表”窗口中单击clip_image002按钮。

最后,在触发器属性窗口中输入触发器的内容,并单击“确定”按钮。

方法二:使用CREATE TRIGGER语句

语法:

CREATE TRIGGER <触发器名>
ON { <表名> | <视图名>}
{ FOR | INSTEAD OF | AFTER}
{ [UPDATE] [,] [INSERT] [,] [DELETE]}
AS
<SQL 语句块>

(2)查看触发器

使用企业管理器

2. 提高操作实验

在学生-课程数据库中用Transact-SQL语句描述下列功能:

1)为学生表建立一个名TRI_INSERT的INSERT触发器。功能是当用户向学生表添加数据时,同时也把这些数据添加到stu表中。其中:学生表和表stu的结构相同。

CREATE TRIGGER TRI_INSERT

ON STUDENT

FOR INSERT

AS

INSERT INTO STU

SELECT * FROM INSERTED

(2)为学生表建立一个名TRI_DELETE的DELETE触发器。功能是当用户从学生表删除数据时,同时把这些要删除的数据添加到stu表中。其中:表student和表stu的结构相同。

CREATE TRIGGER TRI_DELETE

ON STUDENT

FOR DELETE

AS

INSERT INTO STU

SELECT * FROM DELETED

(3)创建一查询存储过程,过程名称为P_CX。参数是学号,输出信息是指定学号所应的姓名、课程名称、成绩。运行时若没有指定学号,则提示请输入学号;若学号不存在则提示学号不存在。

create procedure P_CX

@sno char(10) =null

as

if @sno is null

begin

print '请输入一个学号'

return

end

else if(not exists

(select * from student where sno=@sno))

print '学号不存在'

else

select sname,course.cno,grade

from student,course,sc

where student.sno=sc.sno and course.cno=sc.cno and student.sno=@sno

(4)创建一统计存储过程,过程名称为P_CJTJ。参数是学号,输出信息是指定学号的姓名、选课门数、平均分、总分、最高分、最低分。运行时若没有指定学号,则提示输入学号;若学号不存在则提示学号不存在。

create procedure P_CIJJ

@sno char(10) =null

as

if @sno is null

begin

print '请输入一个学号'

return

end

else if(not exists

(select * from student where sno=@sno))

print '学号不存在'

else

select sname,count(cno) 门数,avg(grade) 平均分,sum(grade) 总分,max(grade) 最高分,min(grade) 最低分

from sc,student

where student.sno=@sno

group by sname

(5)创建一个实现求1—n所有数之和的存储过程, 过程名称为P_SUM。参数是n,输出是前n个之和。如:n=100,则输出5050。

create procedure P_SUM

@n int,

@sum int output

as

declare @i int

set @sum=0

set @i=0

while(@i<=@n)

begin

set @sum=@sum+@i

set @i=@i+1

end

(6)创建一个求指定区间[a,b]的随机数的存储过程, 过程名称为P_RAND。参数据是a和b(a<b),输出a到b之间的一个随机数。

create procedure p_rand

@a int,

@b int,

@c int output

as

set @c =cast((rand()*(@b-@a))+@a as int)

print '一个随机数' +str(@c)

五、调试过程

1、在建立查询指定读者号的阅读信息的存储过程时出现如下错误

clip_image004 ,将每一行的语句都顶格写,命令成功生成。

六、实验结果

1、基本操作实验

(1)在读者表上建立一个DELETE类型的触发器lianxi_del:

clip_image006

(2)建立一个查询指定读者号的阅读信息的存储过程List_jy

clip_image008

2、提高操作实验

(1)在STUDENT表中插入一行数据

INSERT

INTO STUDENT

VALUES('20012123','成龙','男','20','MA')

查看STU表,插入一行数据:

clip_image010

(2)在STUDENT表删除一行数据:

DELETE

FROM STUDENT

WHERE SNO='20015129'

查看STU表,又插入一行数据:

clip_image012

(3)从学生-课程数据库中,查找学号为200215122的学生信息

在查询分析器中输入:

EXECUTE P_CX'200215122'

输出结果:

clip_image014

(4)从学生-课程数据库中,通过统计存储过程查找学号为200215122的学生的统计信息

在查询分析器中输入:

EXECUTE P_CIJJ'200215122'

输出结果:

clip_image016

(5)在查询分析器中输入:

declare @sum int

execute p_sum 5, @sum output

print '总分为:'+str(@sum)

输出结果:

clip_image018

(6)在查询分析器中输入:

declare @c int

exec p_rand 100,300,@c output

print '一个随机数' +str(@c)

clip_image020

七、总结

这次实验主要是让我们了解如何创建一个触发器,触发器在数据库中是如何作用的,如何创建存储过程,存储过程有什么用。

通过认真完成每一道题目,知道了对一个表建立一个或多个触发器后,对表进行作用时,会激活相应的触发器,实现相应的触发作用;知道了通过建立存储过程,可以简化查找等操作功能,避免重复工作。

这是数据库实验的最后一次实验,对这五次实验,我都是认真的对待,花费的时间不少,但是我收获很大。让我重新了解了一遍数据库知识,既完成了实验,又起到了复习的作用,一举两得。通过实验,我对数据库的使用更加了解


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM