1.实验目的
- 掌握使用SQL Server管理平台和Transact-SQL语句创建存储过程、执行存储过程、修改存储过程、删除存储过程的用法。
- 理解使用SQL Server管理平台和Transact-SQL语句查看存储过程定义、重命名存储过程的用法。
- 掌握通过SQL Server管理平台和Transact-SQL语句创建、修改、删除触发器的方法和步骤。
- 掌握引发触发器的方法。
2.实验内容及步骤
请先附加studentsdb数据库,然后完成以下实验。
1.以下代码创建一个存储过程:
CREATE PROCEDURE grade_s
(@sid char(4),
@cid char(4))
AS
BEGIN
SELECT s.学号,s.姓名,g.课程编号,g.分数
FROM student_info s JOIN grade g ON s.学号=g.学号
WHERE s.学号=@sid AND g.课程编号=@cid
END
当grade_s执行时,输入数据0001、k002时,结果是 0001,刘卫平 ,K002,90.0 。
2.以下代码创建一个存储过程stu_g
CREATE PROCEDURE stu_g
@cid nchar(4)
AS
SELECT s.* FROM student_info s INNER JOIN grade g ON s.学号=g.学号
WHERE 课程编号=@cid
当stu_g执行时,输入数据‘k003’,结果是 所有选修了k003的学生在student info中的数据 。
3.设计一个存储过程get_stu完成这样的功能:输出所有学生的学号,姓名,课程编号和分数,并以学号升序、成绩降序显示。请编写程序实现。
SQL语句:
#创建get_stu存储过程
create proc get_stu
as
begin
select a.学号,a.姓名,b.课程编号,c.课程名称,b.分数
from student_info a
join grade b on a.学号=b.学号
join curriculum c on b.课程编号=c.课程编号
order by a.学号 asc,b.分数 desc
end
#调用get_stu存储过程
EXEC get_stu
4.设计一个存储过程stu_course完成这样的功能:输出某个学生(学号参数为@sid)所修读课程的课程名称。编写并调用该存储过程,输出学号为'0003'的学生所修读课程名称。
SQL语句:
#创建存储过程stu_couse
create proc stu_couse
@sid nchar(4)
as
begin
select c.课程名称
from grade g join curriculum c
on g.课程编号=c.课程编号
where g.学号=@sid
end
#调用存储过程stu_couse
exec stu_couse '0003'
5.设计一个存储过程stu_maxg完成这样的功能:使用OUTPUT参数(@maxg)输出某门课程(参数为@cid)最高分。编写调用该存储过程输出‘k001’课程最高分的程序。
SQL语句:
#创建存储过程stu_maxg
create proc stu_maxg
@cid nchar(4),
@maxg decimal(3,1)output
as
begin
select max(g.分数) 最高分
from grade g join curriculum c
on g.课程编号=c.课程编号
where g.课程编号=@cid
end
#调用存储过程stu_maxg
declare @maxg decimal(3,1)
exec stu_maxg 'k001',@maxg output
6.设计一个存储过程proc_modifyc完成这样的功能:修改某门课程(@cid)的课程名称(@cname)和学分(@credit),编写并调用该存储过程,修改课程号为’K003’的课程名称为‘数据库原理与应用’、学分为4。
#创建存储过程proc_modifyc
create proc proc_modifyc
@cid nchar(4),
@cname varchar(50),
@credit nchar(4)
as
begin
update curriculum
set curriculum.课程名称=@cname,
curriculum.学分=@credit
where curriculum.课程编号=@cid
end
#调用存储过程proc_modifyc
exec proc_modifyc @cid='K003',@cname='数据库原理与应用',@credit = 4
select * from curriculum where curriculum.课程编号='K003'
7.复制student_info表命名为stu2,分别为stu2表创建二个触发器stu_insert,stu_update 当对stu2表进行插入、修改时,分别激活该触发器,显示表的操作信息。
--复制student_info(重定向)
SQL语句:
select * into stu2
from student_info
创建insert触发器stu_insert
SQL语句:
create trigger stu_insert
on stu2
for insert
as
begin
print '已插入新的学生数据';
end
--创建update触发器stu_update
SQL语句:
CREATE TRIGGER stu_update
ON stu2
AFTER UPDATE
AS
BEGIN
-- 使用 PRINT 语句显示操作信息
PRINT '已更新学生数据';
END;
插入一条数据(‘0009’,’张瑞芳’,’女’,’1995-11-11’,’广从大道13号’)观察inserted、deleted临时表的变化
SQL语句:
INSERT INTO stu2
VALUES ('0009', '张瑞芳', '女', '1995-11-11 00:00:00.000', '广从大道13号',null);
输出结果:
更新数据,将学号为’0009’学生的姓名改为’张芮芳’,观察inserted、deleted临时表的变化
SQL语句:
UPDATE stu2
SET 姓名 = '张芮芳'
WHERE stu2.学号 = '0009';
8.为student_info表设计一个触发器del_s_g,当stu_info表中的学生记录被删除时,grade表中的所有相应成绩记录能自动删除。
SQL语句:
#创建触发器del_s_g
create trigger del_s_g
on student_info
after delete
as
begin
delete FROM grade
WHERE grade.学号 IN (SELECT grade.学号 FROM deleted);
end;
#调用触发器del_s_g
-- 删除学号为 '0009' 的学生记录
DELETE FROM student_info
WHERE 学号 = '0019';
9.为student_info表设计一个触发器up_s_g,当更新stu_info表中学生的学号时,自动更新grade表中的这个学生的相应选课成绩信息,并显示:成绩表更新成功。
SQL语句:
#创建触发器up_s_g
CREATE TRIGGER up_s_g
ON student_info
FOR UPDATE
AS
BEGIN
DECLARE @idold CHAR(20)
DECLARE @idnew CHAR(20)
SELECT @idnew = 学号 FROM INSERTED
SELECT @idold = 学号 FROM DELETED
UPDATE [dbo].[grade] SET 学号 = @idnew WHERE 学号 = @idold
print '更新了该同学的成绩信息!'
END;
#调用触发器up_s_g
-- 更新学号为 '0001' 的学生记录的学号
UPDATE student_info
SET 学号 = '0002'
WHERE 学号 = '0001';
10.为Curriculum表设计一个触发器trig_c2,不允许修改课程编号。
SQL语句:
#创建触发器trig_c2
create trigger trig_c2
on curriculum
INSTEAD OF UPDATE
as
begin
PRINT '不允许修改课程编号';
if UPDATE(课程编号)
begin
rollback;
end
else
begin
update curriculum
set 课程名称=i.课程名称,学分=i.学分
from curriculum c
inner join inserted i on c.课程编号=i.课程编号;
PRINT '更新成功';
END
END;
#调用触发器trig_c2
-- 修改课程编号为 'C001' 的记录
UPDATE curriculum
SET 课程编号 = 'C002'
WHERE 课程编号 = 'C001';