南昌大学数据库实验完整版 下载本文

③显示0002号学生的平均成绩。

查询结果:

(7) 输入以下代码,复制学生表命名为stu2,为stu2表创建一个触发器stu_tr,当stu2表插入一条记录时,为该记录生成一个学号,该学号为学号列数据的最大值加1。

--复制学生表命名为stu2

SELECT * INTO stu2 FROM 学生 GO

--为stu2表创建一个INSERT型触发器stu_tr CREATE TRIGGER stu_tr ON stu2 FOR INSERT AS

DECLARE @max char(4)

SET @max=(SELECT MAX(学号) FROM stu2) SET @max=@max+1

UPDATE stu2 SET 学号=REPLICATE('0',4-len(@max))+@max FROM stu2 INNER JOIN inserted on stu2.学号=inserted.学号

执行以上代码,查看学生情况数据库中是否有stu2表,展开stu2,查看其触发器项中是否有stu_str触发器。

代码如下:

出现了stu2表。

在查询编辑窗口输入以下代码:

INSERT INTO stu2(学号,姓名,性别) VALUES('0001','张主','女')

运行以上代码,查看stu2表的变化情况,为什么插入记录的学号值发生了改变?

运行前:

36 / 50

插入后:

(8) 为学期成绩表建立一个名为insert_g_tr 的INSERT触发器,当用户向学期成绩表中插入记录时,如果插入的是在课程注册表中没有的课程编号,则提示用户不能插入记录,否则提示记录插入成功。在进行插入测试时,分别输入以下数据:

学号课程编号分数

0007J00476 0008001069

观察插入数据时的运行情况,说明为什么?

触发器生成代码如下:

插入数据:

上图插入成功显示记录插入成功。

(9) 为课程注册表创建一个名为del_c_tr的DELETE触发器,该触发器

37 / 50

的作用是禁止删除课程注册表中的记录。

触发器生成代码如下:

(10) 为学生表创建一个名为update_s_tr的UPDATE触发器,该触发器的作用是禁止更新学生表中的“姓名”字段的内容。

触发器生成代码如下:

(11) 使用Transact-SQL语句DROP TRIGGER删除update_s_tr触发器

触发器生成代码如下:

(12) 为学生表建立删除触发器del_s_tr,要求当学生表的记录被删除后,学期成绩表中相应的记录也能自动删除。

触发器生成代码如下:

38 / 50

(13) 在学生情况数据库中,执行以下事务处理过程,说明这些事务属于哪一种事务类型(隐性事务、显性事务或自动式事务)。

BEGIN TRANSACTION

INSERT INTO 学生(学号,姓名) VALUES('0009','李青') COMMIT TRANSACTION

代码如下:

答:为隐性事务 ②

SET IMPLICIT_TRANSACTIONS ON GO

INSERT INTO grade(学号,课程编号) VALUES('0005','0007') GO

IF ((SELECT count(*) FROM 课程注册 WHERE 课程编号='0007')=0)

代码如下:

答:为显性事务

实验心得

类似于高级语言的使用,要多做才会熟能生巧

实验参考书目

《数据库系统概论》

39 / 50

实验七视图操作

1、 建立选修了某课程的学生花名册的视图course1_student_view,要求带WITH

ENCRYPTION。该花名册包括学生的学号、姓名、系别、专业、和这门课程的成绩。使用sp_helptext和在中分别观察定义的文本。最后利用定义的视图进行查询。

代码如下:

sp_helptext显示规则、默认值、未加密的存储过程、用户定义函数、触发器或视图的文

结果如图:

syscomments表查看:

利用视图查询: 代码如下:

结果如图:

2、 建立统计不及格情况的视图nopass_student_view,列出不及格学生的学号、姓名、不

及格的课程编号和成绩。

代码如下:

3、 在nopass_student_view的基础上,列出不及格学生的学号、姓名、不及格的课程名

称。

代码如下:

40 / 50