SQL Server 2008触发器实战:更新班级人数

5星 · 超过95%的资源 需积分: 31 24 下载量 23 浏览量 更新于2024-09-09 2 收藏 51KB DOC 举报
"SQL-Server2008的触发器练习题目及解答" 在SQL Server 2008中,触发器是一种特殊的存储过程,它在特定的数据操作(如INSERT、UPDATE或DELETE)发生时自动执行。触发器可以用于实现复杂的业务规则和数据完整性检查。以下是对提供的练习题的详细解释: 1) 创建触发器stu_insert: 在这个练习中,目标是在student表上创建一个INSERT触发器,当尝试插入新记录时,如果一次插入多于一条记录,触发器将抛出错误并回滚事务。触发器首先检查@@rowcount系统变量,该变量返回最后执行的Transact-SQL语句影响的行数。如果@@rowcount大于1,说明插入了多条记录,此时触发器通过RAISERROR函数抛出一个自定义错误,并使用ROLLBACK TRAN语句撤销当前事务。return语句用于终止触发器的执行,防止后续语句被执行。 ```sql CREATE TRIGGER stu_insert ON student FOR INSERT AS BEGIN IF @@ROWCOUNT > 1 BEGIN RAISERROR('You cannot insert more than one student at a time.', 16, 1) ROLLBACK TRAN RETURN END UPDATE class SET class_num = class_num + 1 WHERE class_id = (SELECT class_id FROM inserted) PRINT 'Class表中数据更新成功' END GO ``` 测试1:尝试插入两条记录,触发器会捕获到多条插入,抛出错误并回滚事务。 测试2:单独插入一条记录,触发器会成功执行,更新class表中的class_num列,并打印消息。 2) 修改触发器stu_insert: 这个练习要求修改原有的触发器,使其能处理一次插入多条记录的情况。因此,我们不再需要检查@@rowcount,而是直接更新class表。触发器的修改如下: ```sql ALTER TRIGGER stu_insert ON student FOR INSERT AS BEGIN UPDATE class SET class_num = class_num + (SELECT COUNT(*) FROM inserted) WHERE class_id IN (SELECT class_id FROM inserted) PRINT 'Class表中数据更新成功' END GO ``` 现在,无论是一次插入一条还是多条记录,触发器都会正确地更新class表中的class_num列,其值等于新插入的学生记录数。 总结来说,这个练习旨在帮助理解SQL Server 2008中的触发器工作原理,以及如何使用它们来维护数据库的完整性和一致性。触发器是数据库设计的重要组成部分,尤其在需要实施复杂的业务逻辑时,它们能确保数据的准确性和一致性。通过这两个练习,你可以掌握如何创建、修改和测试触发器,以及如何在触发器中处理多个受影响的行。
2009-11-16 上传
一、建立以下五个表: 教师表:Teacher,学生表:Student, 课程表:Course,选课表:SC,授课表:TC 二、完成以下查询: 1.查询成绩在80-90之间的记录。 2.查询至少4个同学选修的课程名。 3.查询其他系中比“信息系”所有学生年龄都大的学生名单及年龄,并按年龄降序输出: 4.查询与学生张建国同岁的所有学生的学号。姓名和系别。 5.查询选修了2门以上课程的学生名单。 6.查询至少有一门与“张建国”选课相同的学生的姓名,课程号,系别 7.查询成绩比该课程平均成绩高的学生的成绩表。 8.查询选课号为01001课程且成绩高于课程01002学生的姓名,此两门课的课程名和成绩。 9.查询所有没选修01001号课程的学生名单 10、查询每个同学各门课程的平均成绩和最高成绩,按降序输出姓名、平均成绩、最高成绩; 11、查询所有学生都选修了的课程号和课程名; 12、查询选修了991102号学生选修了的课程的学生学号和姓名。 三、使用SQL创建视图,修改记录 1.创建成绩视图SCORE_VIEW,包含学号sno,姓名sn,课程名cn,成绩score; 2.创建一个计算机系学生名单视图S_VIEW,包含学号sno,姓名sn,性别sex; 3.通过上面的视图,修改学号为991102,课程号01001的成绩记录; 4,创建一个视图,计算机系学生的成绩单score_view_CDEPT,包含学号sno,姓名sn,课程名cn,成绩score