【SQL Server】华中农业大学空间数据库实验报告 实验九 触发器

1.实验目的

  1. 通过实验课程与理论课的学习深入理解掌握的触发器的原理、创建、修改、删除、基本的使用方法、主要用途,并且可以在练习的基础上,熟练使用触发器来进行数据库的应用程序的设计;
  2. 深入学习深刻理解与触发器相关的T-SQL语句的编写的基本原理、编写方法与常见的编写规范,并通过与数据查询、存储过程的T-SQL语句进行比较,充分了解其间的差异,从而进一步理解T-SQL语句编写代码的方法。

2.实验内容

  1. 创建并执行触发器:交互式为数据库表S创建一级联更新触发器TRIGGER_S、交互式为数据库表SC创建一个限制更新触发器TRIGGER_SC、用SQL为数据库表SC创建一个触发器Score_SC_TRI、用SQL为数据库表C创建一个级联删除触发器TRIGGER_DC;
  2. 修改触发器:交互式修改数据库表S的触发器TRIGGER_S、用SQL修改数据库表C的触发器TRIGGER_DC;
  3. 删除触发器:交互式删除数据库表S的触发器TRIGGER_S、用SQL删除数据库表C的触发器TRIGGER_DC。

3.实验步骤

3.1创建并执行触发器

1.交互式为数据库表S创建一级联更新触发器TRIGGER_S

要求:若修改STUDENT表中一位学生的学号,则SC表中与该学生相关的学号自动修改:

(1)点击【对象资源管理器】—>【数据库】—>【jiaoxuedb】—>【任意一数据库表】—>【触发器】,即可打开新建触发器的编辑窗口如下所示:

(2)根据实验要求,输入代码如下所示,其代码主要分为两个部分,上半部分:创建触发器名称与在哪个数据库表上创建触发器,并且是在进行什么操作(包括UPDATE、INSERT、DELETE)时触发触发器;下半部分:首先声明我们需要用到的形参变量,然后利用SQL语句编写更新代码,SELECT为获得数据,UPDATE表名 SET字段=新值,WHERE条件

(3)验证触发器作用:首先如果STUDENT表与SC表间建立了外键关系,我们需要删除外键,因为外键也会达到跟随变更的效果,我们需要删除外键,仅需要触发器TRIGGER_S单独的效果;

我们将STUDENT表中的S4同学改为S9同学,保存后回到SC表中,可以看到SC表中已经没有S4同学,但是出现了S9同学了:

2.交互式为数据库表SC创建一个限制更新触发器TRIGGER_SC

要求:若修改SC表中一记录的学号,则要检查表STUDENT中是否存在与该学号相同的记录,若存在则不许修改,若不存在则可修改。

(1)新建触发器的编辑窗口,输入代码如下所示,其代码同样分为两部分,上半部分:创建触发器名称:TRIGGER_SC,在数据库表SC上创建触发器,当对列属性SNO有UPDATE指令时触发;下半部分:首先声明我们需要用到的形参变量,然后利用SQL语句编写更新代码,SELECT为获得数据,如果@SNO_CNT不为0,则rollback transaction滚回原操作,即不执行此次更新的操作

(2)验证触发器作用:在SC表中如果想将SNO值修改为STUDENT表中已有的值,则会自动报错,报错内容显示事物在触发器中结束,说明触发器阻止了此不合规范的操作:

3.用SQL为数据库表SC创建一个触发器Score_SC_TRI

要求:当插入一个记录或修改成绩时,确保此记录的成绩在0—100分内

(1)新建触发器的编辑窗口,输入代码如下所示,其代码含义为:上半部分在数据库表SC上,针对操作UPDATE与INSERT,创建触发器命名为Score_SC_TRI,并声明将会用到的变量;下半部分同SQL语句的编码思路,SELECT语句为我们的形参赋值,IF为触发器触发的条件,且只负责离它最近的一个BEGIN END语句

(2)验证触发器作用:使用交互式的方法想要将某一位同学的成绩更改为超过100分时,则会自动报错,报错内容显示事物在触发器中结束,说明触发器阻止了此不合规范的操作:

 

4.用SQL为数据库表C创建一个级联删除触发器TRIGGER_DC

要求:通过课程名从COURESE表中删除某课程信息,同时删除SC表中与此课程相关的选课记录

(1)新建查询,输入代码如下所示,其代码含义为:上半部分在数据库表COURESE上,针对操作DELETE,创建触发器命名为TRIGGER_DC,并声明将会用到的变量;下半部分同SQL语句的编码思路,SELECT语句为形参赋值,DELETE语句进行相应的实验要求操作,此处不需要BEGIN END语句也可以完成触发器的建立:

(2)验证触发器作用:使用交互式的方法在COURESE表中删除课程C5的信息,回到SC表中可以发现选择课程C5的学生的课程信息、成绩都已经被删除了。

3.2修改触发器

1.交互式修改数据库表S的触发器TRIGGER_S

点击【对象资源管理器】—>【数据库】—>【jiaoxuedb】—>【任意一数据库表】—>【触发器】—>【任意一触发器】,点击修改即可打开触发器的编辑界面,根据要求修改触发器即可:

2.用SQL修改数据库表C的触发器TRIGGER_DC

要求:通过课程名从COURESE表中删除某课程信息,同时删除SC表和TC表中与此课程相关的选课记录

新建查询,输入代码如下所示,执行后即可修改触发器,与存储过程的修改相同,与其说是修改触发器,更类似重新编写了一个触发器,因为其基本的修改思路就是重新编写了一个触发器,无论其属性需不需要修改,依然需要写在SQL语句中;

3.3删除触发器

1.交互式删除数据库表S的触发器TRIGGER_S

点击【对象资源管理器】—>【数据库】—>【jiaoxuedb】—>【任意一数据库表】—>【触发器】—>【任意一触发器】,右击后即可看到删除选项

2.用SQL删除数据库表C的触发器TRIGGER_DC

新建查询,输入代码如下所示,T-SQL语句中,DROP语句是非常通用的删除语句,一般的删除数据库、数据库表等都是利用DROP语句:

4.课后习题

基于教学数据库jxsk,创建下面的触发器,并给出正反实例:

1.为数据库表SC创建--触发器:当插入或修改-一个记录时,确保此记录的成绩在0—100分之间:

新建查询,输入代码如下所示,创建一个命名为TRIGGER_SC_1的触发器:

验证:交互式修改S3的C2数据,右图所示为将分数从100改至60,显示成功,而将分数由100改至110,则会显示触发器报错,说明触发器创建成果且符合实际需要:

2.为数据库表C、TC和SC创建参照完整性:级联删除和级联修改触发器:

新建查询,输入代码如下所示,创建一个命名为TRIGGER_SC_1的触发器:

验证:新建查询,输入代码如下所示,利用T-SQL语句修改COURESE表中C6课程的课程号为C7:

结果如下:其中1行受影响为数据库TC,3行受影响为数据库表SC:

3.为数据库表T创建一触发器:当职称从“讲师”晋升为“副教授”时,岗位津贴自动增加500元;从“副教授”晋升为“教授"时,岗位津贴自动增加900元:

新建查询,输入代码如下所示,创建一个命名为TRIGGER_T的触发器:

验证:新建查询,输入代码如下所示,利用T-SQL语句修改教师号为T4的教师职称由讲师更改为副教授:

结果如下所示,当教师职称发生改变时,薪水将会一起改变:

5.实验总结

1.相关概念的学习与区分

存储过程的相关原理:

存储过程代码的编写,其实本质上就是利用SQL语句编写代码的一个过程,只是将比较复杂的过程封装了起来,并且引入了形参作为我们实际使用的变量,形参是存储过程与触发器中都非常重要的一部分,编写存储过程的代码,只有在声明变量时,输出数据的形参后不需要加OUTPUT,其余部分都需要加OUTPUT。因此虽然创建存储过程的编辑窗口看起来很复杂(尤其是交互式方法),但其实原理是非常好理解的,代码的编写也十分简单直接。

而调用存储过程,在我们此次实验过程中可以明显感受到,相比起交互式方法与T-SQL语句的方法,存储过程似乎并没有给我们带来多少的便捷,其根本原因还是在于我们目前数据库中的数据量太少了,这也导致我们无法很好的体验到存储过程设计的目的与优势,事实上,存储过程最大的优点就在于它提高SQL语句的重用性,不仅仅是简化了我们反复编译的操作,同时减少了我们表与表、数据库与服务器的连接次数,从而提高了查询数据库的效率。

触发器的相关原理:

触发器的根本目的,是为了保证实现数据库的完整性简单理解来说就是保证数据库表中数据可以同步更新,这样看来,触发器的作用与效果与我们之前实验课接触的约束十分相似。

但触发器这一工具,主要运用的是数据库中DELETED表与INSERTED表:DELETED表用于存储 DELETE和UPDATE语句所影响的行的副本INSETED表用于存储 INSERT和UPDATE语句所影响的行的副本。触发器更像是利用我们自行编写的SQL语句来对数据库进行一定的‘约束’,相比于之前所学的内容,逻辑上更方便于理解。

2.代码执行与编写思路总结

在此次实验中,正确理解如何利用SQL语句编写创建存储过程与触发器的代码是最为重要也是最困难的一步,部分同学如果实验过程中只是对着实验指导书上的内容照抄,而忽略了进行自我的思考与总结的话,就很难学到此次实验课中的精髓,因此我将我对代码的理解以文字的内容总结如下:

存储过程:以下图的存储过程的代码为例

基础(上半)部分为:CREATE PROCEDURE+【存储过程名】+【形参名】+【形参类型】,其中多个形参用逗号隔开;

下半部分为:AS起手,作为上半与下半的分界线,AS后的所有内容,即符合我们SQL语句编写代码的原理与思路。

触发器:以下图的触发器的代码为例

基础部分为:CREATE TRIGGER 【触发器名】 ON 【数据库表名】 FOR 【UPDATE、INSERT、DELETE】(在进行什么操作时触发触发器);

重点编写部分AS起手,作为分界线

首先+DECLARE,声明我们要用到的所有形参变量及其数据类型;

其次+SELECT FROM WHERE语句,为我们声明的形参变量赋值;

而后的内容,就是根据实验要求需要,利用SQL语句进行代码编写:

IF+通常加在什么样的情况下触发器触发;

BEGIN END 语句:BEGIN+在IF的条件下数据库表进行什么样的修改,可以有多个BEGIN END 语句

ROLLBACK TRANSACTION语句:表示不执行该操作,回滚至原来值。

3.常见问题总结

调用存储过程,SELECT获取的查询结果不符合实际需要:

在创建成功存储过程后,为验证存储过程是否符合我们的需求,一般都会调用存储过程以进行验证,但在此次存储过程的第一个实验步骤进行验证时,就发现得到的结果不符合预期,存储过程返回的结果并不是一个表,而是一个单独的值

经过老师讲解后我们可以知道,其根本原因在于在调用存储过程的代码中,我们使用的是SELECT的调用函数,此函数在我们目前编写的代码逻辑中,得到的第二个结果会将第一个结果覆盖,因此导致:如果我们应该得到多个结果,最后得到结果却只有一个,而且固定为结果中的最后一个

为得到准确的结果,根据老师讲解,我可以用到理论课学习的与后续实验课程会练习的游标(Cursor),循环输SELECT调用函数的查询结果,此次实验中就不再进行深入的探讨与研究,在后续的实验过程中希望有更详细具体的学习。

4.实验心得

(1)本次存储过程与触发器实验的实验操作其实都较为简单,是思路非常清晰的创建、修改、删除一条龙式的实验过程,同时因为有实验指导书的辅助与参考,对于大部分同学来说完成实验内容应该并不是一件困难的事,但其实验比较关键的一点在于:真正理解代码编写的原理,与如何解决验证过程中常出现的一些的错误。因为与往次实验不同的是,在存储过程与触发器编写过程中,我们很少出现代码的报错错误,但在交互式或T-SQL语句编写调用存储过程或触发器的代码时,却常出现得到结果不符合我们预期的情况,考虑到交互式方法的缺点、主外键的影响、约束的限制等等因素,这类情况出现的原因有很多。但归根结底,只要理清其中的逻辑与原理就不难解决;

(2)此次实验中,我感受最为明显的一点就是SQL语句相比于交互式方法的优点:首先是在创建存储过程或触发器的过程中,我们可以很直接的感受到,就算是交互式方法,其底层思路依然是要编写SQL语句,而且交互式方法打开的编辑界面还较为复杂,并不像SQL方法新建查询简洁;除此之外,在调用存储过程或触发器时,如果用交互式直接修改,往往不能立即得到触发器的反馈,而交互式则会直接提示(几行受到影响);同时,如果调用存储过程或触发器显示报错,SQL语句的方法显示的报错原因也比交互式方法更为详细,更方便于我们针对报错原因进行修改;

(3)在存储过程与触发器整个的实验过程中,我再一次体会到了大一时学习C++课程编写代码的感觉,虽然无论是语句的复杂程度还是思路的创建难度目前我们学习到的难度还不及C++的课程,但我能深刻的感受到,二者其最基本的原理与思路都是互通的,我们首先需要明确我们的需求需要获得什么,其次明确在什么样的条件下执行我们的语句,最后也就是我们最重要的部分,根据实验要求编写相应的应执行的代码,我也非常感谢过去的自己与老师,虽然在大学之前从未有过计算机语言的基础,但通过努力认真的学习,已经为现在的自己深入学习打下了良好的基础。

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

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

相关文章

小程序24-滚动效果:scroll-view组件详解

在微信小程序中如果想实现内容滚动,需要使用 scroll-view 组件 scroll-view:可滚动视图区域,适用于需要滚动展示内容的场景,用户可以通过手指滑动或者点击滚动条滚动内容。 scroll-x允许横向滚动scroll-y允许纵向滚动 实现横向…

Leetcode 分发糖果

这段代码的算法思想是 贪心算法,通过两次遍历,分别从左到右、从右到左调整糖果分配,以满足题目中相邻评分较高的孩子必须获得更多糖果的要求,并最终计算出最少需要分配的糖果总数。 以下是代码的详细思想与执行过程: …

39页PDF | 毕马威_数据资产运营白皮书(限免下载)

一、前言 《毕马威数据资产运营白皮书》探讨了数据作为新型生产要素在企业数智化转型中的重要性,提出了数据资产运营的“三要素”(组织与意识、流程与规范、平台与工具)和“四重奏”(数据资产盘点、评估、治理、共享)…

【Redis_Day5】String类型

【Redis_Day5】String类型 String操作String的命令set和get:设置、获取键值对mset和mget:批量设置、获取键值对setnx/setex/psetexincr和incrby:对字符串进行加操作decr/decrby:对字符串进行减操作incrbyfloat:浮点数加…

linux安装mysql57——笔记

rpm -qa | grep mysql有东西就rpm -e 文件名 下载 wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm安装 yum -y install mysql57-community-release-el7-10.noarch.rpm安装 yum -y install mysql-community-server如果出现Error: GPG c…

基于Java Springboot高校会议室预订管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…

基于 NCD 与优化函数结合的非线性优化 PID 控制

基于 NCD 与优化函数结合的非线性优化 PID 控制 1. 引言 NCD(Normalized Coprime Factorization Distance)优化是一种用于非线性系统的先进控制方法。通过将 NCD 指标与优化算法结合,可以在动态调整控制参数的同时优化控制器性能。此方法特别…

数据库表设计范式

华子目录 MYSQL库表设计:范式第一范式(1NF)第二范式(2NF)第三范式(3NF)三范式小结巴斯-科德范式(BCNF)第四范式(4NF)第五范式(5NF&…

中国省级新质生产力发展指数数据(任宇新版本)2010-2023年

一、测算方式:参考C刊《财经理论与实践》任宇新(2024)老师的研究,新质生产力以劳动者劳动资料劳动对象及其优化组合的质变为 基本内涵,借 鉴 王 珏 和 王 荣 基 的 做 法构建新质生产力发展水平评价指标体系如下所示&a…

【爬虫】Firecrawl对京东热卖网信息爬取(仅供学习)

项目地址 GitHub - mendableai/firecrawl: 🔥 Turn entire websites into LLM-ready markdown or structured data. Scrape, crawl and extract with a single API. Firecrawl更多是使用在LLM大模型知识库的构建,是大模型数据准备中的一环(在…

Admin.NET框架前端由于keep-alive设置缓存导致的onUnmount未触发问题

bug版本:next分支,基于.NET6版本; 问题描述: 1、添加keep-alive后,在其下运行的组件会出现onActived(被关注时)和onDeactived(取消关注时)生命周期,而组件原有生命周期为onMounted(被创造时)和onUnmounted(…

机器学习day7-线性回归3、逻辑回归、聚类、SVC

7欠拟合与过拟合 1.欠拟合 模型在训练数据上表现不佳,在新的数据上也表现不佳,常发生在模型过于简单无法处理数据中的复杂模式时。 特征: 训练误差较高 测试误差也高 模型过于简化,不能充分学习训练数据中的模式 2.过拟合 …

【鸿蒙开发】第二十二章 IPC与RPC进程间通讯服务

目录 1 IPC与RPC通信概述 2 实现原理 3 约束与限制 4 使用场景 5 开发步骤 5.1 Native侧开发步骤 5.2 ArkTS侧开发步骤 6 远端状态订阅开发实例 6.1 使用场景 6.1.1 Native侧接口 6.2 ArkTS侧接口 6.3 Stub感知Proxy消亡(匿名Stub的使用) 1 …

【开发小技巧11】用经典报表实现badge list效果,根据回显内容用颜色加以区分

之前使用badge list实现首页指标数据回显,但是无法根据对应数据进行个性化动态展示,那要如何解决呢?下面就来看看如何通过经典报表实现badge list效果,根据回显内容用颜色加以区分。 普通经典报表 想要做成类似这样的效果并且能…

rust中解决DPI-1047: Cannot locate a 64-bit Oracle Client library问题

我们在使用rust-oracle crate连接oracle进行测试的过程中,会发现无法连接oracle,测试运行过程中抛出“DPI-1047: Cannot locate a 64-bit Oracle Client library”错误。该问题是由于rust-oracle需要用到oracle的动态连接库,我们通过安装orac…

cocos creator 3.8 一些简单的操作技巧,材质的创建 1

这是一个飞机的3D模型与贴图 导入到cocos中,法线模型文件中已经包含了mesh、material、prefab,也就是模型、材质与预制。界面上创建一个空节点Plane,将模型直接拖入到Plane下。新建材质如图下 Effect属性选择builtin-unlit,不需…

python oa服务器巡检报告脚本的重构和修改(适应数盾OTP)有空再去改

Two-Step Vertification required: Please enter the mobile app OTPverification code: 01.因为巡检的服务器要双因子认证登录,也就是登录堡垒机时还要输入验证码。这对我的巡检查服务器的工作带来了不便。它的机制是每一次登录,算一次会话…

数据集-目标检测系列- 荷花 莲花 检测数据集 lotus>> DataBall

数据集-目标检测系列- 荷花 莲花 检测数据集 lotus>> DataBall DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,持续增加中。 贵在坚持! 数据样例项目地址: * 相关项目 1)数据集可视化项…

操作系统——揭开盖子

计算机执行时——取指执行 es:bx等于从0x9000开始,到0x90200结束

CTF 攻防世界 Web: SSRF Me write-up

题目名称-SSRF ME captcha 解码 目录扫描没有发现有用结果,根据提示 url 可能用来访问内部资源,根据题目名称可以猜测 ssrf。 其中 Captcha 用到 md5 加密截取,而且在每一次刷新网页时候会改变,可以写代码爆力枚举 Captcha 的值…