如果你对其他数据库原理的实验感兴趣,请考虑阅读我的专栏
SQL Server实验系列
实验目的:
(1)掌握某主流DBMS支持的SQL编程语言和编程规范,规范设计存储过程;
(2)能够理解不同类型触发器的作用和执行原理,验证触发器的有效性;
(3)培养学生的系统思维,提升解决复杂工程问题所需的编程能力。
在前面创建的数据库基础上,定义BEFORE触发器和AFTER触发器;掌握数据库存储过程定义、存储过程运行,存储过程更名,存储过程删除,存储过程的参数传递。
实验过程:
1、创建一个不带参数的简单存储过程
(1)创建存储过程sp_avggrade,实现查询每门课程学生的平均成绩的功能;
CREATE PROCEDURE sp_avggrade AS
BEGIN
SELECT Cno,avg(Grade) as 平均成绩
FROM SC
group by cno
END
GO
(2)调用该存储过程,实现查询。
EXECUTE sp_avggrade
2、创建一个带输入参数的存储过程
(1)创建存储过程sp_course_avggrade, 实现通过输入课程编号参数查询指定课程编号的课程平均成绩的功能;
GO
CREATE PROCEDURE sp_course_avggrade
@cno char(2)
AS
BEGIN
SELECT Cno,AVG(grade)as 平均成绩
FROM SC
WHERE Cno=@cno
GROUP BY Cno
END
go
(2)调用该存储过程,获取指定课程的平均成绩
EXECUTE sp_course_avggrade 2
3、创建一个带输入输出参数的存储过程
(1)创建存储过程sp_sdept _student,实现根据用户输入的院系编号参数,查找该学院的学生人数,并以变量形式输出的功能;
GO
CREATE PROC sp_sdept_student
@sdept CHAR(4),
@name char(4) output,
@sumstudent int output
AS
BEGIN
select @name=sdept from student where @sdept=Sdept group by Sdept
SELECT @sumstudent=COUNT(Sdept)
FROM Student
WHERE @sdept = Sdept
GROUP BY Sdept
END
GO
(2)调用该存储过程,以返回变量的形式获取相应院系的学生人数。
DECLARE @sum char(4),@name char(4) --定义变量
EXECUTE sp_sdept_student CS, @name output, @sum output --执行存储过程,输入两个变量
SELECT @name as 系别, @sum as 系总人数 --查询输出结果
go
4、触发器的创建与使用
(1)在学生表上创建触发器,实现学生表中删除学生记录时,成绩表中该学生成绩记录的级联删除;
--若sc外键不是 on delete cascade,执行下两行代码删除、重建外键
/*
ALTER TABLE SC drop CONSTRAINT fk_no;
ALTER TABLE SC ADD CONSTRAINT fk_sno FOREIGN key (sno) REFERENCES Student(Sno) on delete cascade on update cascade;
*/
GO
CREATE TRIGGER delete_stu_sc
ON student --在x表中创建
FOR DELETE --受x事件触发
AS
BEGIN
DELETE SC
FROM SC,deleted d
WHERE sc.Sno=d.Sno
END
GO
(2)在学生表上创建触发器,若录入的成绩大于100分,小于0分,则拒绝插入记录并显示;
--若创建含记录成绩列的表时,使用了CHECK来约束成绩范围,要删除checx重新创建表
GO
CREATE TRIGGER insert_grade
on sc
FOR INSERT
AS
IF(select grade from inserted) > 100 or (select grade from inserted) <0
BEGIN
Print '录入成绩不符合规定,拒绝插入记录'
rollback transaction
END
GO
(3)验证(1)、(2)中触发器。
DELETE from student where sno='95002'
INSERT INTO SC VALUES (95006, 7, 156)