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

news2024/9/20 1:00:13

在这里插入图片描述

🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨
🐻推荐专栏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,inserted
			where student.sno=inserted.sno)
	begin
		print '插入信息的学号不在学生表中! '
		if not exists (select * from course,inserted where
		course.cno=inserted. cno)
		print '插入信息的课程号不在课程表中!'
		rollback
	end
  else
		begin
			if not exists (select * from course,inserted where
		Course.cno=inserted.cno)
			begin
			print '插入信息的课程号不在课程表中! '
			rollback
		end
	end

在这里插入图片描述

执行:

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.coloradmin.cn/o/676239.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL的版本从5.7跳到了8.0有哪些原因?

MySQL的版本从5.7跳到了8.0的原因? 一、引言1.1、MySQL是什么?1.2、MySQL 5.7和8.0的历史背景 二、MySQL 8.0的新功能2.1、更好的安全性2.2、更高的性能2.3、更好的可扩展性2.4、JSON支持 三、MySQL 8.0的重要改进3.1、更严格的数据类型检查3.2、其他重要…

第三章 处理机调度

目录 一、调度的概念、层次 2.1 调度的基本概念 2.2 调度的三个层次 2.2.1 高级调度 2.2.2 低级调度 2.2.3 中级调度 2.2.3.1 进程的挂起态 2.2.4 三层调度的联系、对比 二、进程调度的时机、切换与过程、方式 2.1 进程调度的时机 2.2 进程调度的方式 2.2.1 非抢占…

MFC的main函数

-- 我们走得太远,忘掉了来时路。 MFC程序的main在哪里? MFC的main是_tWinMain(),有的版本是WinMain(),AfxWinMain(),总之会有Main字样。 作为C/C…

【Spring】Spring有什么用?Spring核心与设计思想之IOC与DI

文章目录 1 何为 Spring?2 什么是容器?3 理解Spring的 IOC3.1 传统开发的缺陷3.2 基于 IOC 思想的开发3.3 再谈Spring中的 IOC 4 理解Spring中的 DI写在最后 1 何为 Spring? Spring是一个开源的、轻量级的、面向企业级的Java应用框架。它提供…

(秋招)vins中的光流法

vins中的光流法 说到光流法,首先介绍其假设条件: 1.亮度恒定,就是同一点随着时间的变化,其亮度不会发生改变。这是基本光流法的假定(所有光流法变种都必须满足),用于得到光流法基本方程。就是…

【CSS3系列】第七章 · 过渡和动画

写在前面 Hello大家好, 我是【麟-小白】,一位软件工程专业的学生,喜好计算机知识。希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正&#xff0…

可视化计算机科学论文库DBLP,高效整理文献,生成领域趋势图、词云图

Github项目链接:https://github.com/yaunsine/getDBLP Http克隆方式:git clone https://github.com/yaunsine/getDBLP.git SSH克隆方式:git clone gitgithub.com:yaunsine/getDBLP.git 作者:yaunsine dblp网站相信大家都不陌生&am…

模拟电路系列文章-ADC驱动电路

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 提示:这里可以添加技术概要 模数转换器(Analog to Digital Convertor,ADC)将模拟量转变成数字量,是电学测量、控制领域—个极为重要的部件。 一个模拟电压信号,在进入A…

统信UOS系统开发笔记(六):提取在线安装软件后,提取其安装包,部署目标机使用离线软件包方式安装软件

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/131348876 红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…

数据库底层物理存储层 的管理方案

​专栏内容: postgresql内核源码分析 手写数据库toadb 并发编程 个人主页:我的主页 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. 数据库的物理存储层 简介 数据库的数据,在物理介质上…

【二叉树part04】| 110.平衡二叉树、257.二叉树的所以路径、404.左叶子之和

目录 ✿LeetCode110.平衡二叉树❀ ✿LeetCode257.二叉树的所有路径❀ ✿LeetCode404.左叶子之和❀ ✿LeetCode110.平衡二叉树❀ 链接:110.平衡二叉树 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为&…

Redis的数据类型及对应的数据结构(一)

Redis的数据类型和数据结构的对应关系 左边是 Redis 3.0版本的,也就是《Redis 设计与实现》这本书讲解的版本,右边是7.0,注意区别很大 数据类型包括:String、List、Hash、Set、ZSet 对应的底层数据结构入上图 String的应用场景 缓存对象 …

17.API Promise化 miniprogram-api-promise

目录 1 安装 2 配置 3 使用 1 安装 安装之后会在项目路径下出现这个目录,这个目录中又我们之前安装过的npm包 我们删除掉 miniprogram_npm 这个目录 然后点击构建 npm 构建之后就自动变成这样 2 配置 进入 app.js,然后写下面这些东西 3 使用

C++——auto关键字

目录 1. auto简介 2. auto的使用细则 3. auto的实际应用价值 1. auto简介 在早期C/C中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,但遗憾的是一直没有人去使用它,大家可思考下为什么? C11中&…

安装单机版openGauss

安装单机版openGauss 环境白名单查看ip地址问题解决python版本之间的问题yum指向2.7的编译 安装启动数据库 环境 下载python3.6.8 首先linux中的版本是默认的2.7.5.要下载3.6.8,需要用到wget, openGauss数据库基本操作(超详细) …

MATLAB 之 低层绘图操作和光照及材质处理

这里写目录标题 一、低层绘图操作1. 曲线对象2. 曲面对象3. 文本对象4. 其他核心对象4.1 区域块对象4.2 方框对象 二、光照和材质处理1. 光照处理2. 材质处理2.1 图形对象的反射特性2.2 material 函数 一、低层绘图操作 MATLAB 将曲线、曲面、文本等图形均视为对象&#xff0c…

五、一些经典的网络架构

一、Alexnet 2012年卷积神经网络的开篇鼻祖 但放到现在确实有很多的弊端和有待改进的地方 1,网络基本架构 8层网络,其中有5层卷积,3层全连接 网络层数的定义:主要看有没有参数运算的参与,例如卷积层和全连接就可以…

Xubuntu22.04之安装少儿编程scratch3.3(一百八十二)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

SPEC CPU 2006 gcc version 8.3.0 (Uos 8.3.0.3-3+rebuild) x86_64 源码编译tools 错误处理笔记

编译tools 拷贝tools到安装目录 cp /mnt/iso/tools /opt/speccpu2006/ -r 执行编译 su rootcd /opt/speccpu2006/tools/src sh -x buildtools 错误 undefined reference to __alloca 编辑./make-3.82/glob/glob.c,注释掉以下宏判断 you should not run config…

「网络编程」第二讲:socket套接字(四 - 完结)_ Linux任务管理与守护进程 | TCP协议通讯流程

「前言」文章是关于网络编程的socket套接字方面的,上一篇是网络编程socket套接字(三),这篇续上篇文章的内容,下面开始讲解! 「归属专栏」网络编程 「笔者」枫叶先生(fy) 「座右铭」前行路上修真我 「枫叶先…