创建数据库存储过程与触发器:showscore与s_del

需积分: 1 0 下载量 199 浏览量 更新于2024-09-11 收藏 51KB DOCX 举报
"数据库习题,包括创建存储过程和触发器" 在数据库管理中,存储过程和触发器是两个非常重要的概念。存储过程是预编译的SQL语句集合,可以封装一系列操作,并且可以带有参数,便于重复使用。而触发器是一种特殊的存储过程,它在特定的数据操作(如INSERT、UPDATE或DELETE)发生时自动执行,可以用来实施复杂的业务规则和数据完整性。 题目中的第一个任务是创建一个名为“showscore”的存储过程,用于根据学生姓名显示他们的课程数量、不及格课程数量以及平均成绩。存储过程的实现首先通过JOIN操作连接SC表和S表,基于学生的姓名查询他们选修的课程总数(@Count)和平均成绩(@Avg)。接着,同样通过JOIN查询,但加上成绩小于60的条件,来计算不及格课程的数量(@uCount)。最后,将这些信息格式化后输出。 具体代码如下: ```sql CREATE PROC showscore @姓名 varchar(20) AS BEGIN DECLARE @Count INT, @uCount INT, @Avg FLOAT, @Str VARCHAR(300) SELECT @Count = COUNT(课号), @Avg = AVG(成绩) FROM SC, S WHERE SC.学号 = S.学号 AND S.姓名 = @姓名 SELECT @uCount = ISNULL(COUNT(课程), 0) FROM SC, S WHERE SC.学号 = S.学号 AND S.姓名 = @姓名 AND 成绩 < 60 SET @Str = @姓名 + '同学一共选了' + CAST(@Count AS VARCHAR(3)) + '门课程' + '其中有' + CAST(@uCount AS VARCHAR(3)) + '门不及格' + '其平均成绩为' + CAST(@avg AS VARCHAR(5)) + '分' PRINT @Str END ``` 这个存储过程执行时,如示例所示,传入学生姓名(例如'王飞'),会显示对应的学生的课程情况。 第二个任务是创建一个名为“s_del”的删除触发器,当尝试从S表中删除学生时,如果该学生在SC表中有选课记录,则阻止删除操作并给出提示;否则,允许删除并将其记录保存到S_BAK表中,用于后续可能的数据恢复。触发器的实现通过检查DELETED表(在删除操作后包含被删除的行)和SC表的交集来判断是否存在选课记录。 具体代码如下: ```sql CREATE TRIGGER s_del ON S FOR DELETE AS BEGIN IF EXISTS (SELECT * FROM SC, DELETED WHERE DELETED.学号 = SC.学号) BEGIN RAISERROR('试图删除有课的学生,删除失败!', 16, 1) END ELSE BEGIN INSERT INTO S_BAK SELECT * FROM DELETED PRINT '删除成功' END END ``` 这个触发器在执行删除操作时,如果发现被删除的学生有选课记录,会抛出错误,阻止删除;否则,将被删除的记录插入到S_BAK表中,并打印“删除成功”作为提示。 这两个数据库操作体现了存储过程和触发器在实际应用中的功能,它们能够增强数据库的灵活性和安全性,简化复杂操作,同时也确保了数据的一致性和完整性。