数据库实验1-6参考答案 下载本文

内容发布更新时间 : 2024/5/18 11:07:33星期一 下面是文章的全部内容请认真阅读。

alter table student add check(sdept in('计算机系','数学系','信息系','物理系'))

4、触发器

(1)定义一个触发器,其基本功能是在SC表中增加或修改一个选课记录时,检查该课程的选课人数是否超过限定(可自行定义一个限定值,根据表中数据的情况而定)。若超过限定值,则拒绝操作。 触发器代码:

CREATE TRIGGER trig1 ON SC FOR INSERT,UPDATE AS

IF(SELECT COUNT(*) FROM SC WHERE CNO=(select CNO from INSERTED))>10 BEGIN

PRINT '选课人数超过上限' ROLLBACK END

(2)定义一个触发器,当删除Student表中数据时,先将删除的数据插入到另一个专门存放已删除数据的表中(实验时,首先定义一个与Student表结构相同的表用来存放删除的数据),然后执行删除操作。 触发器代码:

select top 0 * into s1 from student

create trigger trig2 on student for delete as

insert into s1 select * from deleted

5、用户权限控制

(1)在自己数据库中添加其他用户。

(2)为添加的用户进行授权和权限收回。相互检查是否获得了相应的权限。

sp_adduser 'rj107','rj107'

grant select on student to rj107

21

grant select,update(cname) on course to rj107 revoke select on course from rj107 sp_dropuser 'rj107'

四、实验小结

五、评阅成绩

实验预习20% 实验过程20% 实验结果30% 实验报告30% 总成绩 22

实验六 视图与存储过程

一、实验目的

1、掌握视图的定义及使用

2、掌握存储过程的建立和调用

二、实验预习

1、基本表与视图有什么不同?哪种视图可以更新?

2、视图定义语句格式:

3、什么是存储过程,其作用主要是什么?

三、实验内容和要求

1、视图(将执行的SQL语句写在下面)

(1)建立视图IS_STUDENT,视图中包含信息系全体学生的基本信息。 CREATE VIEW IS_STUDENT AS

SELECT * FROM STUDENT WHERE Sdept='信息系'

(2)建立视图CJ_STUDENT,视图中包含所有成绩不及格的学生的学号,姓名,课程名,成绩。

CREATE VIEW CJ_STUDENT AS

SELECT Student.Sno,Sname,Cname,Grade FROM STUDENT,Course,SC WHERE Grade<60 and Student.Sno=SC.Sno and Course.Cno=SC.Cno

23

(3)建立视图AVG_CJ,视图包括学生的学号以及他们的平均成绩,按成绩降序排列。

CREATE VIEW AVG_CJ(Sno,Gavg) AS

SELECT Sno,AVG(Grade) FROM SC GROUP BY Sno

SELECT * FROM AVG_CJ ORDER BY Gavg DESC

(4)修改视图IS_STUDENT,将年龄均加1。观察基本表Student中相应的数据是否发生变化。

UPDATE IS_STUDENT SET Sage=Sage+1

相应变化

(5)在视图IS_STUDENT中插入新的记录,学号为9531103,姓名为张玉,女,21岁。

INSERT INTO IS_STUDENT

VALUES('9531103','张玉','女',21,'')

(6)根据视图AVG_CJ,查询平均成绩大于60的学生的学号。 SELECT Sno FROM AVG_CJ WHERE Gavg>60

2、存储过程

(1)建立存储过程student_Grade1,功能是查询计算机系学生的成绩,包括学号,姓名,课程名,成绩,按学号升序排序。 存储过程代码:

CREATE PROC STUDENT_GRADE1 AS

SELECT STUDENT.SNO,SNAME,CNAME,GRADE FROM STUDENT,SC,COURSE WHERE STUDENT.SNO=SC.SNO

AND SC.CNO=COURSE.CNO AND SDEPT='计算机系' ORDER BY STUDENT.SNO ASC

执行存储过程代码:EXEC STUDENT_GRADE1

(2)建立存储过程student_Grade2,功能是根据参数提供的系名,查询该系学生的成绩,包括学号,姓名,课程名,成绩,按学号升序排序。

24

存储过程代码:

CREATE PROC STUDENT_GRADE2 @DEPT CHAR(20) AS

SELECT STUDENT.SNO,SNAME,CNAME,GRADE FROM STUDENT,SC,COURSE WHERE STUDENT.SNO=SC.SNO

AND SC.CNO=COURSE.CNO AND SDEPT=@DEPT

ORDER BY STUDENT.SNO ASC

执行存储过程代码:EXEC STUDENT_GRADE2 '信息系'

(3)建立存储过程student_Grade3,功能是根据参数提供的学生的姓名和课程名,查询该学生相应的课程成绩,若存在不为空的成绩,则返回参数值为成绩值,否则返回-1。

存储过程代码:

CREATE PROC STUDENT_GRADE3 @STUDENT_NAME CHAR(7), @COURSE_NAME CHAR(50), @X SMALLINT OUTPUT AS

SELECT @x=grade FROM STUDENT,SC,COURSE WHERE STUDENT.SNO=SC.SNO AND SC.CNO=COURSE.CNO AND SNAME=@STUDENT_NAME AND CNAME=@COURSE_NAME IF(@X IS NOT NULL) RETURN @x ELSE

SET @x=-1 RETURN @x

执行存储过程代码: DECLARE @X SMALLINT

EXEC STUDENT_GRADE3 '李勇','VB',@X OUTPUT PRINT @X 结果输出:87

DECLARE @X SMALLINT

EXEC STUDENT_GRADE3 '李勇','计算机导论',@X OUTPUT PRINT @X 结果输出:-1

25

(4)建立存储过程check_Xk,功能是根据提供的参数学号和课程号,完成选课记录的插入功能。要求如下:

? 首先检查该课程选课人数是否已满(可自己根据表中数据的情况定义一个限

定值),若满,则返回一个0;若不满,继续检查该学生是否已经选满3门课程,若满,则返回-1,否则将选课记录插入到SC表中,并返回1。 存储过程代码:

create procedure check_xk @sno char(10),@cno char(10) as

if (select count(*) from sc where cno=@cno)>=5 return 0 else begin

if (select count(*) from sc where sno=@sno)>=3 return -1 else begin

insert into sc(sno,cno) values(@sno,@cno) return 1 end end

执行存储过程代码: declare @i int

exec @i=check_xk '9531103','C03' print @i

四、实验小结

五、评阅成绩

实验预习20% 实验过程20% 实验结果30% 实验报告30% 总成绩

26