存储过程与触发器的练习题

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执行时,输入数据0001k002时,结果是 0001,刘卫平  K00290.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中的数据        

存储过程与触发器的练习题_第1张图片

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_insertstu_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’)观察inserteddeleted临时表的变化

SQL语句:

INSERT INTO stu2 
VALUES ('0009', '张瑞芳', '女', '1995-11-11 00:00:00.000', '广从大道13号',null);

输出结果:

更新数据,将学号为’0009’学生的姓名改为张芮芳,观察inserteddeleted临时表的变化

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';

你可能感兴趣的:(SQL,java,服务器,数据库,sql,mysql)