③显示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