5.13
数据库实验报告三
-- 创建数据库角色
CREATE
ROLE [20224082-role]; GO
-- 将用户添加到角色
ALTER ROLE [20224082-role] ADD MEMBER [20224082-user];
GO
use students
go
grant update on Student(Sname,Ssex,Sage) to [20224074-user]
go
grant select on Student to [20224074-role];
grant select on Course to [20224074-role];
grant select on SC to [20224074-role];
拒绝自己创建的角色拥有sc表中grade的修改权限。
Deny update on SC(grade) to [20224074-role]
4.7.1用管理器创建触发器实现如下安全性和完整性:定义 course 表中 credit 属性为“3”的缺省。
create trigger dbo.st1
on [dbo].[Course]
after insert,update
as
begin
set nocount on;
update Course set Ccredit=3 from Course
join SC on SC.Cno=Course.Cno
where Sno in(select Sno from inserted where Cno=null)
end
go
4.7.2建立 course 与 sc 表间来维护参照完整性而使用的一个级联删除触发器、一个级联修改触发器和一个受限插入触发器。
-- 级联删除触发器
CREATE TRIGGER trg_CascadeDelete ON course
AFTER DELETE
AS
BEGIN
DELETE FROM sc WHERE cno IN (SELECT cno FROM DELETED);
END;
GO
-- 级联修改触发器
CREATE TRIGGER trg_CascadeUpdate ON course
AFTER UPDATE
AS
BEGIN
IF UPDATE(cno)
BEGIN
DECLARE @OldCno INT, @NewCno INT;
SELECT @OldCno = cno FROM DELETED;
SELECT @NewCno = cno FROM INSERTED;
UPDATE sc SET cno = @NewCno WHERE cno = @OldCno;
END;
END;
GO
-- 受限插入触发器
CREATE TRIGGER trg_RestrictInsert ON sc
INSTEAD OF INSERT
AS
BEGIN
IF NOT EXISTS (SELECT 1 FROM course WHERE cno IN (SELECT cno FROM INSERTED))
BEGIN
RAISERROR('Invalid course number', 16, 1);
ROLLBACK TRANSACTION;
END
ELSE
BEGIN
INSERT INTO sc (sno, cno, grade)
SELECT sno, cno, grade FROM INSERTED;
END
END;
GO
对“students 数据库”编写存储过程,完成下面功能:
4.8.1成绩 60 分以下的人数;
4.8.2统计给定 cno 的课程的平均成绩,并返回平均成绩;
4.8.3将 sc 表中 grade 从百分制改为等级制(5、4、3、2、1)。即 0-20 分为 1,21-40
为 2,4 1-60 为 3,61-80 为 4,81-100 为 5。
-- 统计成绩60分以下的人数
CREATE PROCEDURE CountLowGrades
AS
BEGIN
SELECT COUNT(*) AS LowGradeCount
FROM sc
WHERE grade < 60;
END;
GO
-- 统计给定cno课程的平均成绩
CREATE PROCEDURE GetAverageGrade
@cno INT
AS
BEGIN
SELECT AVG(grade) AS AverageGrade
FROM sc
WHERE cno = @cno;
END;
GO
-- 将百分制成绩改为等级制
CREATE PROCEDURE ConvertGradesToScale
AS
BEGIN
UPDATE sc
SET grade = CASE
WHEN grade BETWEEN 0 AND 20 THEN 1
WHEN grade BETWEEN 21 AND 40 THEN 2
WHEN grade BETWEEN 41 AND 60 THEN 3
WHEN grade BETWEEN 61 AND 80 THEN 4
WHEN grade BETWEEN 81 AND 100 THEN 5
ELSE grade
END;
END;
GO
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义