如何使用SQL语句创建触发器

在这里插入图片描述

🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨
🐻推荐专栏1: 🍔🍟🌯C语言初阶
🐻推荐专栏2: 🍔🍟🌯C语言进阶
🔑个人信条: 🌵知行合一
🍉本篇简介:>记录SQL server触发器的创建语句,以及简单介绍.

前言

目录

  • 前言
  • 一、触发器的介绍
    • 1.1 触发器 的概念以及定义:
    • 1.2 、 触发器 的作用
  • 二、使用SQL语句创建触发器实例
    • 1.创建`after`融发器
    • 2.创建`instead of`触发器

一、触发器的介绍

1.1 触发器 的概念以及定义:

触发器 是一种特殊类型的存储过程,它不同于我们前面介绍过的存储过程。存储过程可以通过语句直接调用,而 触发器主要是通过事件进行触发而被执行的.
例如当对某一表进行诸如UPDATE(修改)、INSERT(插入)、DELETE(删除)这些操作时,SQL Server 就会自动执行触发器所定义的SQL语句,从而确保对数据之间的相互关系,实时更新.

1.2 、 触发器 的作用

触发器的主要作用就是其能够实现由 主键 外键 所不能保证的复杂的参照完整性和数据的一致性。除此之外, 触发器 还有其它许多不同的功能:

①、复杂的约束条件
触发器 能够实现比CHECK 语句更为复杂的约束。

②、保证数据的安全

触发器 因为 触发器是在对数据库进行相应的操作而自动被触发的SQL语句可以通过数据库内的操作从而不允许数据库中未经许可的指定更新和变化。

③.级联式

触发器 可以根据数据库内的操作,并自动地级联影响整个数据库的各项内容。例如:对A表进行操作时,导致A表上的 触发器被触发,A中的 触发器中包含有对B表的数据操作(UPDATE(修改)、INSERT(插入)、DELETE(删除)),而该操作又导致B表上 触发器被触发。

④.调用存储过程

为了响应数据库更新, 触发器 可以调用一个或多个存储过程.

但是,总体而言, 触发器性能通常比较低。

三、 触发器 的种类
SQL Server 中一般支持以下两种类型的触发器:

  1. AFTER 触发器

  AFTER 触发器 要求只有执行某一操作(INSERT、UPDATE、DELETE)之后, 触发器 才被触发,且只能在表上定义。可以为针对表的同一操作定义多个 触发器
2. INSTEAD OF 触发器

  INSTEAD OF 触发器 表示并不执行其所定义的操作(INSERT、UPDATE、DELETE),而仅是执行 触发器 本身。既可在表上定义INSTEAD OF 触发器 ,也可以在视图上定义INSTEAD OF 触发器 ,但对同一操作只能定义一个INSTEAD OF 触发器

二、使用SQL语句创建触发器实例

1.创建after融发器

(1)创建一个在插入时触发的触发器sc_insert,当向sc表插入数据时,须确保插入的学号已在student表中存在,并且还须确保插入的课程号在Course表中存在﹔若不存在,则给出相应的提示信息,并取消插入操作,提示信息要求指明插入信息是学号不满足条件还是课程号不满足条件(注:Student表与sc表的外键约束要先取消)。

语句实现:

create trigger sc_insert
on sc
after insert
as
if not exists (select * from student,insertedwhere student.sno=inserted.sno)beginprint '插入信息的学号不在学生表中! 'if not exists (select * from course,inserted wherecourse.cno=inserted. cno)print '插入信息的课程号不在课程表中!'rollbackendelsebeginif not exists (select * from course,inserted whereCourse.cno=inserted.cno)beginprint '插入信息的课程号不在课程表中! 'rollbackendend

在这里插入图片描述

执行:

insert into sc
values ( '20110112','001','78')

删除外键约束;

alter table sc
drop constraint FK_sc__sno__332C9D34

(2)为Course表创建一个触发器Course_del,当删除了Course表中的一条课程信息时,同时将表sc表中相应的学生选课记录删除掉。

create trigger course_del
on course
after delete
as
if exists(select * from sc, deleted
where sc.cno=deleted.cno)
begin
delete from sc
where sc.cno in (select cno from deleted)
end
delete from Course
where Cno='003'

在这里插入图片描述

select * from sc

在这里插入图片描述

(3)在Course表中添加一个平均成绩avg_Grade字段(记录每门课程的平均成绩),创建一个触发器Grade_modify,当sc表中的某学生的成绩发生变化时,则Course表中的平均成绩也能及时相应的发生改变。

Course表中添加一个平均成绩avg_Grade字段

alter table Course
add avg_Grade smallint

avg_Grade中添加数据

update course
set avg_Grade= (select AVG(Grade) from sc
where sc.Cno=Course.Cno)

查看Course表:

select *from Course

在这里插入图片描述

创建Grade_modify触发器

create trigger Grade_modify
on sc
after update
as
if update(grade)
begin
update course
set avg_grade=(select avg (grade)
from sc where course.cno=sc.cno
group by cno)
end
update sc
set Grade='90 '
where sno='20050001' and cno='001'

2.创建instead of触发器

(1)创建一视图Student_view,包含学号、姓名、课程号、课程名、成绩等属性,在Student_view上创建一个触发器Grade_moidfy,当对Student_view中的学生的成绩进行修改时,实际修改的是sc中的相应记录。

创建视图:

create view student_view
as
select s.Sno,Sname , c.Cno , Cname , Grade
from student s , course c, sc
where s.Sno=sc.sno and c.Cno=sc.cno

创建触发器:

create trigger Grade_moidfy 
on student_view
instead of update
as
if UPDATE (Grade)
begin
update sc
set Grade= (select Grade from inserted) where
Sno= (select sno from inserted) and 
Cno= (select Cno from inserted)
End
update student_viewset Grade=40
where Sno='20110001'and Cno='002'

测试修改数据:

select *
from student_view

(2)在sc表中插入一个getcredit字段(记录某学生,所选课程所获学分的情况),创建一个触发器ins_credit,当更改(注:含插入时)sc表中的学生成绩时,如果新成绩大于等于60分,则该生可获得这门课的学分,且该学分须与Course表中的值一致﹔如果新成绩小于60分,则该生未能获得学分,修改值为0。

添加新字段getcredit :

alter table sc
add getcredit smallint

创建触发器:

create trigger sc_up
on sc
after insert,update
as
declare @xf int,@kch char(3),@xh char(8),@fs int
select @fs=grade,@kch=cno,@xh=sno from inserted
if @fs>=60
update sc set @xf=(select credit from course where
sc.Cno=course.cno) where sno=@xh and cno=@kch
else
update sc set @xf=0 where sno=@xh and cno=@kch
修改数据:
update sc
set Grade='90'
where Sno='20050001' and cno='001'

以上就是对触发器的基本认识了,希望对大家有所帮助.

欢迎友友们私信与牛牛讨论问题.,只是牛牛的认知范围有限,目前只关注c语言,数据结构,C++等部分领域.
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spark SQL生产优化经验--任务参数配置模版

大表扫描 特殊case说明:当任务存在扫event_log表时需注意,若对event_log表进行了过滤,且过滤比很高,如下图的case,input为74T,但shuffle write仅为3.5G,那么建议提高单partition的读取数据量&a…

接口测试之测试原则、测试用例、测试流程......

一、接口的介绍 软件测试中,常说的接口有两种:图形用户接口(GUI,人与程序的接口)、应用程序编程接口(API)。 接口(API)是系统与系统之间,模块与模块之间或者…

elasticsearch学习篇:初识ES

一、什么是ES 1、基础概念 是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容es是elastic stack(ELK)的核心,负责存储、搜索、分析数据。 ELK包括以下内容: ELK被广泛应用在日志数据…

【Web3】认识元宇宙

元宇宙在Web3中扮演着重要的角色,可以带来许多创新和变革。Web3是下一代互联网的概念,强调去中心化、区块链技术和加密货币的应用。 元宇宙在Web3中的几个作用: 去中心化的虚拟世界:元宇宙通过使用区块链技术和去中心化的网络结构…

【MySQL事务】保证数据完整性的利器

1、事务的认识 事务:事务就是将多个SQL给打包在一起,组成一个整体。组成这个整体的各个SQL,要么全部成功,要么全部失败。 举例说明: 情人节到了,滑稽老铁打算给他女朋友小美发给红包,但是他又害…

QWebEngine应用---执行javascript

我们都知道现代前端技术是基于html、css和javascript进行显示交互的,其中html和css属于静态界面显示,辅以javascript使页面交互更丰富。浏览器作为前端页面显示的基石,提供一套显示、交互、调试的东西。QWebEngine同样也提供了这些功能&#…

spring如何使用junit进行测试

第一步maven的pom.xml引入坐标&#xff1a; <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version></dependency> 第二步编写测试方法&#xff1a; 第三步 定义scope类型

ARM实验-ARM主程序调用ARM/C语言子程序

一、实验名称&#xff1a;ARM主程序调用ARM/C语言子程序 二、实验目的&#xff1a; 了解ARM应用程序框架。了解ARM汇编程序函数和C语言程序函数相互调用时&#xff0c;遵循的ATPCS标准&#xff1b;了解和掌握ARM汇编程序调用C语言程序函数的基本方法&#xff1b;了解和掌握AR…

学习Maven Web 应用

Maven Web 应用 本章节我们将学习如何使用版本控制系统 Maven 来管理一个基于 web 的项目&#xff0c;如何创建、构建、部署已经运行一个 web 应用。 创建 Web 应用 我们可以使用 maven-archetype-webapp 插件来创建一个简单的 Java web 应用。 打开命令控制台&#xff0c;…

LNMT(linux下nignx+mysql+tomcat(中间件)应用)部署应用、及各服务介绍、部署开源站点jpress

目录 一、环境准备 二、tomcat1和tomcat2服务器&#xff0c;安装配置tomcat 1.tomcat服务器介绍 2.JDK软件介绍 3.查看JDK是否安装 4.tomcat1和tomcat2服务器&#xff0c;安装JDK1.8.0_191&#xff08;JDK必须和nginx版本相适应&#xff0c;不然一直报错&#xff09; 5.安…

软件测试之【单元测试、系统测试、集成测试】

一、单元测试的概念 单元测试&#xff08;Unit Testing&#xff09;是对软件基本组成单元进行的测试&#xff0c;如函数&#xff08;function或procedure&#xff09;或一个类的方法&#xff08;method&#xff09;。当然这里的基本单元不仅仅指的是一个函数或者方法&#xff0…

web爬虫第四弹 - 生产者与消费者模型

聊聊天 做了很长一段时间爬虫工作&#xff0c; 一直没时间记录。 去年好不容易静下心来想写点东西&#xff0c; 也是因为各种琐事断掉了&#xff0c; 看了下之前的爬虫笔记。 web爬虫第三弹&#xff0c; postman的使用&#xff1b; 第四弹&#xff1a;代理ip的充分使用&#x…