完全转发自: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)建立触发器
方法一:使用企业管理器
首先,打开企业管理器,定位数据库并找到要创建触发器的表;
然后,右击该表名,在弹出的快捷菜单中选择“设计表”,在打开的“设计表”窗口中单击按钮。
最后,在触发器属性窗口中输入触发器的内容,并单击“确定”按钮。
方法二:使用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、在建立查询指定读者号的阅读信息的存储过程时出现如下错误
六、实验结果
1、基本操作实验
(1)在读者表上建立一个DELETE类型的触发器lianxi_del:
(2)建立一个查询指定读者号的阅读信息的存储过程List_jy
2、提高操作实验
(1)在STUDENT表中插入一行数据
INSERT
INTO STUDENT
VALUES('20012123','成龙','男','20','MA')
查看STU表,插入一行数据:
(2)在STUDENT表删除一行数据:
DELETE
FROM STUDENT
WHERE SNO='20015129'
查看STU表,又插入一行数据:
(3)从学生-课程数据库中,查找学号为200215122的学生信息
在查询分析器中输入:
EXECUTE P_CX'200215122'
输出结果:
(4)从学生-课程数据库中,通过统计存储过程查找学号为200215122的学生的统计信息
在查询分析器中输入:
EXECUTE P_CIJJ'200215122'
输出结果:
(5)在查询分析器中输入:
declare @sum int
execute p_sum 5, @sum output
print '总分为:'+str(@sum)
输出结果:
(6)在查询分析器中输入:
declare @c int
exec p_rand 100,300,@c output
print '一个随机数' +str(@c)
七、总结
这次实验主要是让我们了解如何创建一个触发器,触发器在数据库中是如何作用的,如何创建存储过程,存储过程有什么用。
通过认真完成每一道题目,知道了对一个表建立一个或多个触发器后,对表进行作用时,会激活相应的触发器,实现相应的触发作用;知道了通过建立存储过程,可以简化查找等操作功能,避免重复工作。
这是数据库实验的最后一次实验,对这五次实验,我都是认真的对待,花费的时间不少,但是我收获很大。让我重新了解了一遍数据库知识,既完成了实验,又起到了复习的作用,一举两得。通过实验,我对数据库的使用更加了解