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


    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中的数据        

    3.设计一个存储过程get_stu完成这样的功能:输出所有学生的学号,姓名,课程编号和分数,并以学号升序、成绩降序显示。请编写程序实现。

    SQL语句:

    1. #创建get_stu存储过程
    2. create proc get_stu
    3. as
    4. begin
    5. select a.学号,a.姓名,b.课程编号,c.课程名称,b.分数
    6. from student_info a
    7. join grade b on a.学号=b.学号
    8. join curriculum c on b.课程编号=c.课程编号
    9. order by a.学号 asc,b.分数 desc
    10. end
    11. #调用get_stu存储过程
    12. EXEC get_stu

    4.设计一个存储过程stu_course完成这样的功能:输出某个学生(学号参数为@sid)所修读课程的课程名称。编写并调用该存储过程,输出学号为'0003'的学生所修读课程名称。

    SQL语句:

    1. #创建存储过程stu_couse
    2. create proc stu_couse
    3. @sid nchar(4)
    4. as
    5. begin
    6. select c.课程名称
    7. from grade g join curriculum c
    8. on g.课程编号=c.课程编号
    9. where g.学号=@sid
    10. end
    11. #调用存储过程stu_couse
    12. exec stu_couse '0003'

    5.设计一个存储过程stu_maxg完成这样的功能:使用OUTPUT参数(@maxg)输出某门课程(参数为@cid)最高分。编写调用该存储过程输出‘k001’课程最高分的程序。

    SQL语句:

    1. #创建存储过程stu_maxg
    2. create proc stu_maxg
    3. @cid nchar(4),
    4. @maxg decimal(3,1)output
    5. as
    6. begin
    7. select max(g.分数) 最高分
    8. from grade g join curriculum c
    9. on g.课程编号=c.课程编号
    10. where g.课程编号=@cid
    11. end
    12. #调用存储过程stu_maxg
    13. declare @maxg decimal(3,1)
    14. exec stu_maxg 'k001',@maxg output

    6.设计一个存储过程proc_modifyc完成这样的功能:修改某门课程(@cid)的课程名称(@cname)和学分(@credit),编写并调用该存储过程,修改课程号为’K003’的课程名称为数据库原理与应用、学分为4

    1. #创建存储过程proc_modifyc
    2. create proc proc_modifyc
    3. @cid nchar(4),
    4. @cname varchar(50),
    5. @credit nchar(4)
    6. as
    7. begin
    8. update curriculum
    9. set curriculum.课程名称=@cname,
    10. curriculum.学分=@credit
    11. where curriculum.课程编号=@cid
    12. end
    13. #调用存储过程proc_modifyc
    14. exec proc_modifyc @cid='K003',@cname='数据库原理与应用',@credit = 4
    15. select * from curriculum where curriculum.课程编号='K003'

    7.复制student_info表命名为stu2,分别为stu2表创建二个触发器stu_insertstu_update 当对stu2表进行插入、修改时,分别激活该触发器,显示表的操作信息。

    --复制student_info(重定向)

     SQL语句:

    1. select * into stu2
    2. from student_info

    创建insert触发器stu_insert

    SQL语句:

    1. create trigger stu_insert
    2. on stu2
    3. for insert
    4. as
    5. begin
    6. print '已插入新的学生数据';
    7. end

    --创建update触发器stu_update

    SQL语句:

    1. CREATE TRIGGER stu_update
    2. ON stu2
    3. AFTER UPDATE
    4. AS
    5. BEGIN
    6. -- 使用 PRINT 语句显示操作信息
    7. PRINT '已更新学生数据';
    8. END;

    插入一条数据(‘0009’,’张瑞芳’,’’,’1995-11-11’,’广从大道13’)观察inserteddeleted临时表的变化

    SQL语句:

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

    输出结果:

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

    SQL语句:

    1. UPDATE stu2
    2. SET 姓名 = '张芮芳'
    3. WHERE stu2.学号 = '0009';

    8.为student_info表设计一个触发器del_s_g,当stu_info表中的学生记录被删除时,grade表中的所有相应成绩记录能自动删除。

    SQL语句:

    1. #创建触发器del_s_g
    2. create trigger del_s_g
    3. on student_info
    4. after delete
    5. as
    6. begin
    7. delete FROM grade
    8. WHERE grade.学号 IN (SELECT grade.学号 FROM deleted);
    9. end;
    10. #调用触发器del_s_g
    11. -- 删除学号为 '0009' 的学生记录
    12. DELETE FROM student_info
    13. WHERE 学号 = '0019';

    9.为student_info表设计一个触发器up_s_g,当更新stu_info表中学生的学号时,自动更新grade表中的这个学生的相应选课成绩信息,并显示:成绩表更新成功。

    SQL语句:

    1. #创建触发器up_s_g
    2. CREATE TRIGGER up_s_g
    3. ON student_info
    4. FOR UPDATE
    5. AS
    6. BEGIN
    7. DECLARE @idold CHAR(20)
    8. DECLARE @idnew CHAR(20)
    9. SELECT @idnew = 学号 FROM INSERTED
    10. SELECT @idold = 学号 FROM DELETED
    11. UPDATE [dbo].[grade] SET 学号 = @idnew WHERE 学号 = @idold
    12. print '更新了该同学的成绩信息!'
    13. END;
    14. #调用触发器up_s_g
    15. -- 更新学号为 '0001' 的学生记录的学号
    16. UPDATE student_info
    17. SET 学号 = '0002'
    18. WHERE 学号 = '0001';

    10.为Curriculum表设计一个触发器trig_c2,不允许修改课程编号。

    SQL语句:

    1. #创建触发器trig_c2
    2. create trigger trig_c2
    3. on curriculum
    4. INSTEAD OF UPDATE
    5. as
    6. begin
    7. PRINT '不允许修改课程编号';
    8. if UPDATE(课程编号)
    9. begin
    10. rollback;
    11. end
    12. else
    13. begin
    14. update curriculum
    15. set 课程名称=i.课程名称,学分=i.学分
    16. from curriculum c
    17. inner join inserted i on c.课程编号=i.课程编号;
    18. PRINT '更新成功';
    19. END
    20. END;
    21. #调用触发器trig_c2
    22. -- 修改课程编号为 'C001' 的记录
    23. UPDATE curriculum
    24. SET 课程编号 = 'C002'
    25. WHERE 课程编号 = 'C001';

  • 相关阅读:
    【力扣 - 只出现一次的数字】
    流媒体服务器ZLMediaKit与FFmpeg
    java毕业设计病房管理系统mybatis+源码+调试部署+系统+数据库+lw
    谷粒商城--品牌管理(OSS、JSR303数据校验)
    JAVA8实战 -- Lamdba表达式
    【从零开始游戏开发】Unity优化:UI控件优化 | 全面总结 |建议收藏
    java100-集合类简介
    paraview选择固定区域的流场输出
    第十七章 源代码文件 REST API 教程(二)
    java基于ssm+vue高校人事管理系统
  • 原文地址:https://blog.csdn.net/m0_55834564/article/details/134553709