当前位置: 首页 > news >正文

【数据库学习笔记】SQL触发器(例题+代码)

数据库SQL

1、触发器概念

(1)触发器(trigger)是用户定义在关系表上的一类由事件驱动的存储过程,由服务器自动激活。

(2)触发器可进行更为复杂的检查和操作,具有更精细和更强大的数据控制能力。

(3)触发器是一种特殊的存储过程,不管什么原因造成的数据变化都能自动响应,对于每条SQL语句,触发器仅执行一次。

总之触发器是一个自动激活的存储过程

 2、触发器的分类

在SQLServer2008中,按照触发事件的不同可以将触发器
分两大类:DML触发器和DDL触发器。

(1)DML触发器。当数据库中发生数据操纵语言 (DML)事件时将调用DML触发器。一般情况下,DML事件包括对表或视图的INSERT语句、UPDATE语句和DELETE语句,因而DML触发器也可分三种类型:INSERT、UPDATE和DELETE。(对数据操作)

(2)DDL触发器。DDL触发器也是由相应的事件触发 的,但DDL触发器触发的事件是数据定义语句(DDL)。这些语句主要是以CREATE、ALTER、DROP等关键字开头的语句。(对对象操作)

3、触发器的实现

CREATE TRIGGER trigger_name
ON {table/view}   /*指定操作对象*/
{FOR/AFTER/INSTEAD OF}
{INSERT/UPDATE/DELETE}
AS {sql_statement }   /*一条或多条SQL语句*/

After:用于说明触发器在指定操作成功执行后触发

instead of:指定用DML触发器中的操作代替触发语句的操作,一条DML语句最多只能定义一条instead of触发器。

{INSERTIUPDATE|DELETE}:触发器事件,触发器的事件可以 是插入INSERT、更新UPDATE和删除DELETE事件,也可以是这几个事件的组合。

  • 变量的定义:declare @ 变量名 数据类型
  • 循环:while..{..}
  • 撤销数据更改:rollback
  • 提交数据更改:commit
  • 语句块:Begin....End
  • 条件判断:IF..else

例:创建触发器,保证学生表中的性别仅能取男和女。

create trigger sexUpt
on Student
for insert, update
as if exists(select * from inserted where sex not in('男','女')rollback
/*本例的inserted表结构与Student表结构相同*/

例:创建一个表tablel,其中只有一列a。在表上创 建一个触发器,每次插入操作时,将变量@str的值设为“TRIGGERISWORKING”并显示。 

CREATE TABLE table1(a int)
go
CREATE TRIGGER table1_insert
ON table1 
AFTER INSERT
AS
BEGIN
DECLARE @str char(50)
SET @str='TRIGGER IS WORKING'
PRINT @str
END
/*begin...end是T-SQL语言语句块*/

例:创建触发器,当向CJB表中插入一个学生的成绩时,将XSB
表中该学生的总学分加上添加的课程的学分。

CREATE TRIGGER jb_ insert
ON CIB AFTER INSERT AS
BEGIN
DECLARE @num char(6), @kc_num char(3)
DECLARE @xf int
SELECT @num=学号,@kc_num=课程号from inserted
SELECT @xf=学分 FROM KCBWHERE 课程号=@kc_num
UPDATE XSB SET总学分=总学分+@xfWHERE =@num
PRINT'修改成功'
End;

创建UPDATE触发器。UPDATE触发器在对触发器表执行 UPDATE语句后触发。在执行UPDATE触发器时,将触发器表的原记录保存到deleted时表中,将修改后的记录保存到inserted临时表中。

触发器是对临时表进行操作的。

例:创建触发器,当修改XSB表中的学号时,同时也要将CJB表 中的学号修改成相应的学号(假设XSB表和CJB表之间没有定义外键约束)。

CREATE TRIGGER *sb_update
ON XSB AFTER UPDATE
AS
BEGIN
DECLARE @old_num char(6), @new_num char(6)
SELECT @old_num= 学号 FROM deleted
SELECT @new_num= 学号 FROM inserted
UPDATE CIB SET 学号=@new_numWHERE 学号=@old_num
END;

即更新操作也要经过临时表。

例:在删除XSB表中的一条学生记录时将CJB表中该学生的相应记录也删除。

CREATE TRIGGER xsb_delete
ON XSB AFTER DELETE
AS
BEGINDELETE FROM CJBWHERE 学号 IN(SELECT 学号 FROM deleted)
END;  /*在SQL中本来这里deleted的地方应该是XSB表*/

例:在KCB表中创建UPDATE和DELETE触发器,当修改或删除KCB表中的“课程号”字段时,同时修改或删除CJB表中的该课程号。

CREATE TRIGGER kcb_trig 
ON KCB AFTER UPDATE, DELETE 
AS
BEGINIF(UPDATE(课程号))UPDATE CIB SET 课程号=( SELECT 课程号 FROM inserted)WHERE 课程号=(SELECT 课程号 FROM deleted)
ELSEDELETE FROM CJB WHERE 课程号 IN(SELECT 课程号 FROM deleted)
END;

例:定义一个触发器,为学生表student定义完整性 规则:学生的年龄不得小于10岁,如果小于10岁则自动修改为10岁。 

create trigger name_change
on Student for insert, update
as 
beginupdate Student set Sage = 10 where Sage <10
end;

例:写一个允许用户一次只删除一条记录的触发器。(这里要用到聚合函数)

create trigger tr_emp 
on employee after delete
as 
declare @row_cnt int 
select @row_cnt=count(*) from deleted
if @row_cnt>1
begin 
print'此删除操作可能回删除多条人事表数据!!!'
rollback transaction
end

创建INSTEAD OF触发器。AFTER触发器 是在触发语句执行后触发的,与AFTER触发器不同 的是,INSTEADOF触发器触发时只执行触发器内部的SQL语句,而不执行激活该触发器的SQL语句。一个表或视图中只能有一个INSTEADOF触发器。

例:写一个触发器,当用户将course表中的学分修改为大于7的值时,不对数据进行修改,同时发出提示信息。

Create trigger not_allowed
On course
Instead of update
As
Begin
Declare @credit int, @cno char(4) Select @cno= cno,@credit=credit from inserted
if @credit>7Printf‘学分不允许大于7’
elseupdate course set credit=@credit where cno =@cno
End

相关文章:

【数据库学习笔记】SQL触发器(例题+代码)

数据库SQL 1、触发器概念 &#xff08;1&#xff09;触发器&#xff08;trigger&#xff09;是用户定义在关系表上的一类由事件驱动的存储过程&#xff0c;由服务器自动激活。 &#xff08;2&#xff09;触发器可进行更为复杂的检查和操作&#xff0c;具有更精细和更强大的数…...

Unittest02|TestSuite、TestRunner、HTMLTestRunner、处理excel表数据、邮件接收测试结果

目录 八、测试套件TestSuite和测试运行器TestRunner 1、基本概念 2、创建和使用测试套件 3、 自动发现测试用例、创建测试套件、运行测试 4、生成html的测试报告&#xff1a;HTMLTestRunner 1️⃣导入HTMLTestRunner模块 2️⃣运行测试用例并生成html文件 九、unittest…...

BAPI_BATCH_CHANGE在更新后不自动更新批次特征

1、问题介绍 在CL03中看到分类特性配置了制造日期字段&#xff0c;并绑定了生产日期字段MCH1~HSDAT MSC2N修改批次的生产日期字段时&#xff0c;自动修改了对应的批次特性 但是通过BAPI&#xff1a;BAPI_BATCH_CHANGE修改生产日期时&#xff0c;并没有更新到批次特性中 2、BAPI…...

顶会评测集解读-AlignBench: 大语言模型中文对齐基准

评测集社区 CompssHub 作为司南 OpenCompass大模型评测体系的重要组成部分&#xff0c;致力于简化并加快研究人员和行业人士搜索和使用评测集的过程。评测集社区 CompssHub 目前已收录了学科、推理、知识、代码等12个方向的评测集&#xff0c;欢迎大家探索。 为了将评测集社区…...

MySQL外键类型与应用场景总结:优缺点一目了然

前言&#xff1a; MySQL的外键简介&#xff1a;在 MySQL 中&#xff0c;外键 (Foreign Key) 用于建立和强制表之间的关联&#xff0c;确保数据的一致性和完整性。外键的作用主要是限制和维护引用完整性 (Referential Integrity)。 主要体现在引用操作发生变化时的处理方式&…...

【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的网上书店管理系统的设计与实现

开题报告 本研究论文主要介绍了基于Spring Boot框架开发的全面网上书店管理系统的构建与实现。该系统以用户为核心&#xff0c;提供了丰富的个性化服务功能。首先&#xff0c;系统支持用户进行便捷的登录注册操作&#xff0c;并具备安全可靠的密码修改机制&#xff0c;同时允许…...

力扣面试题 - 40 迷路的机器人 C语言解法

题目&#xff1a; 设想有个机器人坐在一个网格的左上角&#xff0c;网格 r 行 c 列。机器人只能向下或向右移动&#xff0c;但不能走到一些被禁止的网格&#xff08;有障碍物&#xff09;。设计一种算法&#xff0c;寻找机器人从左上角移动到右下角的路径。 网格中的障碍物和空…...

ElementPlus 自定义封装 el-date-picker 的快捷功能

文章目录 需求分析 需求 分析 我们看到官网上给出的案例如下&#xff0c;但是不太满足我们用户想要的快捷功能&#xff0c;因为不太多&#xff0c;因此需要我们自己封装一些&#xff0c;方法如下 外部自定义该组件的快捷内容 export const getPickerOptions () > {cons…...

二百八十二、ClickHouse——删除Linux中的ClickHouse

一、目的 由于ClickHosue的库表发生变化&#xff0c;需要删除原有的表结构数据&#xff0c;才能直接把脚本里文件重新安装 二、删除步骤 1、关闭ClickHouse服务 systemctl stop clickhouse-server 2、卸载ClickHouse软件包 sudo yum remove clickhouse-server clickhouse…...

c++ 命名空间使用规则

之前一直没搞懂为什么c 用了using namespace std;就能直接调用内部的类&#xff0c;直接调用内部函数 今天试着实现了一下&#xff1a; #include <iostream>// 命名空间 namespace mp{ class point{public: // 构造函数point(int x 0, int y 0) : x(x), y(y) {}//…...

从 ELK Stack 到简单 — Elastic Cloud Serverless 上的 Elastic 可观察性

作者&#xff1a;来自 Elastic Bahubali Shetti, Chris DiStasio 宣布 Elastic Cloud Serverless 上的 Elastic Observability 正式发布 — 一款完全托管的可观察性解决方案。 随着组织规模的扩大&#xff0c;一个能够处理分布式云环境的复杂性并提供实时洞察的可观察性解决方…...

Pandas系列|第二期:Pandas中的数据结构

1.Pandas中的数据结构&#xff1a;Series和DataFrame Pandas 的主要数据结构是 Series &#xff08;一维数据&#xff09;与 DataFrame&#xff08;二维数据&#xff09;&#xff0c;这两种数据结构足以处理金融、统计、社会科学、工程等领域里的大多数典型用例。 Series 是一…...

Hadoop中MapReduce过程中Shuffle过程实现自定义排序

文章目录 Hadoop中MapReduce过程中Shuffle过程实现自定义排序一、引言二、实现WritableComparable接口1、自定义Key类 三、使用Job.setSortComparatorClass方法2、设置自定义排序器3、自定义排序器类 四、使用示例五、总结 Hadoop中MapReduce过程中Shuffle过程实现自定义排序 一…...

数位dp-acwing

题目&#xff1a;Windy数 1083. Windy数 - AcWing题库 分析 不能有前导0&#xff0c;初始化的时候需要有前导0&#xff0c;因为除了最高位数其他位数可以。 windy &#xff1a; 2 5 1 类似这样的数 第二位与第一位相差3 > 2 分类讨论 &#xff1a; 1. 位数跟 n 同位数 的…...

智慧园区小程序开发制作功能介绍

智慧园区小程序开发制作功能介绍 智慧园区小程序系统作为一款面向园区企业的一站式线上服务平台&#xff0c;可为企业提供数智化的园区办公服务。智慧园区小程序功能介绍 1、园区公告、政策信息查看足不出户掌握最新动态&#xff0c;“园区公告、政策信息”等信息。首页点击对应…...

STM32高级 物联网之Wi-Fi通讯

Wi-Fi基础知识 Wi-Fi由来 Wi-Fi,又称“无线网路”,是Wi-Fi联盟的商标,一个基于IEEE 802.11标准的无线局域网技术。“Wi-Fi”常写作“WiFi”或“Wifi”,但是这些写法并没有被Wi-Fi联盟认可。 Wi-Fi这个术语经常被误以为是指无线保真(Wireless Fidelity),类似历史悠久的…...

LLM预训练recipe — 摘要版

文章核心主题&#xff1a; 本文深入探讨了从零开始进行大型语言模型&#xff08;LLM&#xff09;预训练&#xff08;pretrain&#xff09;的各个环节&#xff0c;侧重方法论和实践细节&#xff0c;旨在普及预训练过程中的关键步骤、常见问题及避坑技巧&#xff0c;而非技术原理…...

波动理论、传输线和S参数网络

波动理论、传输线和S参数网络 传输线 求解传输线方程 对于传输线模型&#xff0c;我们通常用 R L G C RLGC RLGC 来表示&#xff1a; 其中 R R R 可以表示导体损耗&#xff0c;由于电子流经非理想导体而产生的能量损耗。 G G G 表示介质损耗&#xff0c;由于非理想电介质…...

nginx-1.23.2版本RPM包发布

nginx-1.23.2-0.x86_64.rpm用于CentOS7系统的安装&#xff0c;安装路径与编译安装是同一个路径。安装方法&#xff1a; 将nginx-1.23.2-0.x86_64.rpm上传至目标服务器&#xff0c;执行rpm -ivh nginx-1.23.2-0.x86_64.rpm命令进行安装。 卸载方法&#xff1a; 卸载前先将nginx服…...

如何用WPS AI提高工作效率

对于每位职场人而言&#xff0c;与Word、Excel和PPT打交道几乎成为日常工作中不可或缺的一部分。在办公软件的选择上&#xff0c;国外以Office为代表&#xff0c;而在国内&#xff0c;WPS则是不可忽视的一大选择。当年一代天才程序员求伯君创造了WPS&#xff0c;后面雷军把它装…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...

高考志愿填报管理系统---开发介绍

高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发&#xff0c;采用现代化的Web技术&#xff0c;为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## &#x1f4cb; 系统概述 ### &#x1f3af; 系统定…...

图解JavaScript原型:原型链及其分析 | JavaScript图解

​​ 忽略该图的细节&#xff08;如内存地址值没有用二进制&#xff09; 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么&#xff1a;保存在堆中一块区域&#xff0c;同时在栈中有一块区域保存其在堆中的地址&#xff08;也就是我们通常说的该变量指向谁&…...

简单介绍C++中 string与wstring

在C中&#xff0c;string和wstring是两种用于处理不同字符编码的字符串类型&#xff0c;分别基于char和wchar_t字符类型。以下是它们的详细说明和对比&#xff1a; 1. 基础定义 string 类型&#xff1a;std::string 字符类型&#xff1a;char&#xff08;通常为8位&#xff09…...