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

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语句:

#创建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';

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/202566.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【古月居《ros入门21讲》学习笔记】18_常用可视化工具的使用

目录 说明: 1. Qt工具箱 日志输出工具:rqt_console 绘制数据曲线:rqt_plot 图像渲染工具:rqt_image_view 综合工具:rqt 2. 三维可视化工具:Rviz Rviz启动 使用示例 3. 仿真平台:Gazebo…

通用plantuml模板头

通用plantuml文件 startuml participant Admin order 0 #87CEFA // 参与者、顺序、颜色 participant Student order 1 #87CEFA participant Teacher order 2 #87CEFA participant TestPlayer order 3 #87CEFA participant Class order 4 #87CEFA participant Subject order …

004:Direct 2D离屏渲染(Qt中实现)

简介: 用QT开发图像显示的小程序,需要一些标注工具,由于用的是opengl渲染,所以就在内存中进行绘制,然后纹理贴图贴出去,发现Qt绘制的效果太差,且速度一般,于是就想着用direct2d来绘制…

MySQL根据binlog恢复数据

简介 本文介绍了使用mysqlbinlog导出数据,根据binlog恢复数据,和导出数据时报需要super权限的解决方法。 环境 MySQL: 5.7.40 说明 MySQL的binlog是数据库服务器在运行过程中产生的日志文件,记录了数据库增删改的操作,可用于恢复和…

leetcode二叉树

下面的两个题呢是比较类似的所以放在一起讲,更好的理解起来。 https://leetcode.cn/problems/same-tree/description/ 这个题就是比较两颗树是不是一样的,这个其实看起来就只要比较当前节点,我们分析成子问题就是判断两颗树当前节点是不是一致…

Java实现动态加载的逻辑

日常工作中我们经常遇到这样的场景,某某些逻辑特别不稳定,随时根据线上实际情况做调整,比如商品里的评分逻辑,比如规则引擎里的规则。 常见的可选方案有: JDK自带的ScriptEngine 使用groovy,如GroovyClassLoader、Gro…

《尚品甄选》:后台系统——分类品牌和规格管理(debug一遍)

文章目录 一、分类品牌管理1.1 表结构介绍1.2 列表查询1.3 添加功能1.4 修改功能1.5 删除功能 二、商品规格管理2.1 表结构介绍2.2 列表查询2.3 添加功能2.4 修改功能2.5 删除功能 一、分类品牌管理 分类品牌管理就是将分类的数据和品牌的数据进行关联,分类数据和品…

48、Flink DataStream API 编程指南(1)- DataStream 入门示例

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

Web安全漏洞分析-XSS(中)

随着互联网的迅猛发展,Web应用的普及程度也愈发广泛。然而,随之而来的是各种安全威胁的不断涌现,其中最为常见而危险的之一就是跨站脚本攻击(Cross-Site Scripting,简称XSS)。XSS攻击一直以来都是Web安全领…

微信小程序本地和真机调试文件上传成功但体验版不成功

可能是微信小程序ip白名单的问题,去微信公众平台(小程序)上设置小程序的ip白名单 1、在本地中取消不校验 然后在本地去上传文件,就会发现控制台报错了,会提示一个https什么不在ip白名单,复制那个网址 2、…

【中间件】DAL中间件intro

中间件middleware 内容管理 intro数据访问层why use DAL中间件主流DAL中间件方案DAL浅析 本文从理论上介绍一下服务化背景下的DAL中间件的理论并浅析相关中间件 cfeng之前work的时候产品发展到分离服务不分库的阶段,所以根本不需要DAL中间件,也没有分布式…

机器学习——决策树

1.决策树 2.熵(不确定程度) 3.信息增益 & 信息增益比 3.1 信息增益 & 信息增益比 的 概念 3.2 案例解释说明 3.2.1数据集说明 3.2.2计算 4.&#x…

软件设计师——计算机组成原理(一)

📑前言 本文主要是【计算机组成原理】——软件设计师计算机组成原理的习题,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 &…

[React] 2023年最新面试题

[React] 2023年最新面试题 1. class 组件与函数组件的区别2. react 18 新特性有那些?新增 createRoot API自动批处理过渡更新新的Hook 3. redux 和 react-redux 的区别4. redux 中间件的原理5. setState 发生了什么 ,render 函数做了什么6. 虚拟DOM, Fi…

海外储能认证标准

北美认证 UL9540 代表一个封装完整的储能系统功能安全认证,关注机械测试,电器测试和环境测试 UL9540A 关注消防本身,UL9540A测试主要从电池储能系统安装参数,安装通风要求,消防设施,消防策略和应对措施…

SpringCloud 一

认识微服务 随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢? 单体架构 单体架构:将业务的所有功能集中在一个项目中开发,打成一个…

springmvc实验(三)——请求映射

【知识要点】 方法映射概念 所谓的方法映射就是将前端发送的请求地址和后端提供的服务方法进行关联。在springMVC框架中主要使用Controller和RequestMapping两个注解符,实现请求和方法精准匹配。注解符Controller Spring中包含了一个Controller接口,但是…

【springboot】Spring 官方抛弃了 Java 8!新idea如何创建java8项目

解决idea至少创建jdk17项目 问题idea现在只能创建最少jdk17,不能创建java8了吗?解决 问题 idea现在只能创建最少jdk17,不能创建java8了吗? 我本来以为是 IDEA 版本更新导致的 Bug,开始还没在意。 直到我今天自己初始化项目时才发现&…

在日常工作中怎么处理vue项目中的错误的?

​🌈个人主页:前端青山 🔥系列专栏:Vue篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容:vue项目中的错误如何处理 目录 一、错误类型 二、如何处理 后端接口错误 代码逻辑问题 全局设…

亚马逊云与生成式 AI 的融合:未来展望与综述

文章目录 前言生成式AI的定义生成式 AI应用领域AI办公软件AI创意工具AI企业服务AI网络安全AIIT 运维AI软件开发AI数据智能AI数字代理AI金融AI医疗AI教育AI工业AI汽车AI机器人 后记 前言 在当今数据时代,人工智能和云计算已经成为了企业发展和创新的必不可少的工具。…