SQL Server 数据库,创建触发器避免数据被更改

news2024/11/27 20:51:15

5.4触发器

      触发器是一种特殊类型的存储过程,当表中的数据发生更新时将自动调用,以响应INSERT、 UPDATE 或DELETE 语句。

5.4.1什么是触发器

1.触发器的概念

      触发器是在对表进行插入、更新或删除操作时自动执行的存储过程,触发器通常用于强制业务 规则,是一种高级约束,可以定义比用CHECK约束更为复杂的约束,可执行复杂的SOL语句(如 F/WHLE/CASE).可引用其他表中的列。触发器主要是通过事件进行触发而被执行的,而存储过程 可以通过存储过程名称而被直接调用。当对某一表进行修改,如UPDATE,INSERT,DELETE这些操作 时,SQL Server 会自动执行触发器所定义的SaL语句,从而确保对数据的处理必须符合由这些SaL 语句所定义的规则。由此触发器可分为以下几种。

   > INSERT触发器:当向表中插入数据时触发,自动执行触发器所定义的SOL语句。

   > UPDATE触发器:当更新表中某列、多列时触发,自动执行触发器所定义的SQL语句。

   > DELETE 触发器:当删除表中记录时触发,自动执行触发器所定义的SQL语句。

2. deleted 表和 inserted 表

      每个触发器有两个特殊的表:删除表(deleted表)和插入表(inserted表)。这两个表是逻辑表,并 且这两个表是由系统管理的,存储在内存中,不是存储在数据库中,因此不允许用户直接对其进行修改。

    这两个表的结构与被该触发器作用的表有相同的表结构。这两个表是动态驻留在内存中的,当 触发器工作完成,它们也被删除,这两个表主要保存因用户操作而被影响的原数据值或新数据值。 另外,这两个表是只读的,即用户不能向其写入内容,但可以引用表中的数据。例如,可用语句查 看deleted表中的信息:SELECT * FROM deleted。

    deleted 表:用于存储DELETE和UPDATE语句所影响的行的副本,即在deleted 表中临时保存被 删除或被更新前的记录行。在执行DELETE或UPDATE语句时,行从触发器表中删除,并传输到deleted 表中。由此我们可以从deleted表中检查删除的数据行是否能删除。如果不能,就可以回滚撤销此操 作,因为触发器本身就是一个特殊的事务单元。

    inserted 表:用于存储INSERT和UPDATE语句所影响的行的副本,即在inserted 表中临时保存被 插入或被更新后的记录行。在执行INSERT或UPDATE语句时.新加行被同时添加到inserted表和触发 器表中,由此我们可以从inserted表中检查插入的数据是否满足业务需求,如果不满足,就可以向用 户报告错误消息,并回滚撤销操作。

    更新语句类似于在删除之后执行插入:首先旧行被复制到deleted 表中,然后新行被复制到触 发器表和inserted表中。

    综上所述,inserted表和deleted表用于临时存放对表中数据行的修改信息,它们在具体的增加. 删除、更新操作时的情况如表5-2所示。

3.触发器的作用

    触发器的主要作用是,实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性,除 此之外,触发器还有其他许多功能,下面简单介绍这些功能。

1)强化约束

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

   约束和触发器在特殊情况下各有优势。触发器的主要优势在于它可以包含使用T-SOL代码的复 杂处理逻辑。因此,触发器可以支持约束的所有功能。

   在约束所支持的功能无法满足应用程序的功能要求时,触发器极为有用。例如:

       > 除非REFERENCES子句定义了级联引用操作,否则FOREIGN KEY约束只能以与另一列中的值 完全匹配的值来验证列值。

      > CHECK约束只能根据逻辑表达式或同一表中的另一列来验证列值,如果应用程序要求根据 另一个表中的列验证列值,则必须使用触发器。

      > 约束只能通过标准的系统错误信息传递错误信息。如果应用程序要求使用(或能从中获益) 自定义信息和较为复杂的错误处理,则必须使用触发器。

2)跟踪变化

    触发器可以侦测数据库内的操作,从而不允许数据库中未经许可的更新和变化。

3)级联运行

    触发器可以侦测数据库内的操作,并自动地级联影响整个数据库的各项内容。例如,某个表上 的触发器中包含对另外一个表的数据操作,如删除、更新、插入,而该操作又导致该表上触发器被 触发。触发器可通过数据库中的相关表实现级联更改:不过,通过级联引用完整性约束可以更有效 地执行这些更。

   > 触发器可以禁止或回滚违反引用完整性的更改,从而取消所尝试的数据修改。当更改外键 且新值与主键不匹配时,此类触发器就可能发生作用。例如,可以在成绩表上创建一个插 入触发器,使它在新值与学员表中的某个值不匹配时回滚一个插入,不过,通常使用FOREIGN KEY来达到这个目的。

  > 如果触发器表上存在约束,则在执行INSERT.UPDATE及DELETE触发器前检查这些约束。 如果不满足约束,则不执行INSERT.UPDATE及DELETE触发器。

注:INSERT、UPDATE、DELETE触发器在数据行已修改完成后,对 修改的数据行进行必要的善后处理。若发现有错误,则用事务回滚 (ROLLBACKTRANSACTION)撤销本次操作,所以INSERT、UPDATE、 DELETE触发器在约束检查之后才执行。

实验环境(实验案例三)

xueyuan 表

需求描述

创建一个UPDATE触发器,以确保xueyuan表中的数据不会被更改。

create trigger reminder
on xueyuan
for update
as
print '禁止修改,如需修改请联系DBA'
rollback transaction
go

 更改失败

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

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

相关文章

彻底解决公网ip无法访问服务器的问题

用服务器的公网ip访问突然提示页面无法访问了,之前还是ok的: 解决方案: 步骤1. 检查云服务器的安全组规则是否有添加80端口映射,如果没有需要手动添加,否则不能使用公网访问,检查了一下是有的&#xff1…

SpringBoot3-实现和注册拦截器

1、pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.…

项目管理:为什么项目计划必不可少

项目管理计划定义了如何执行、监督和控制项目。项目计划让我们准确地知道在项目的每个阶段应该做什么&#xff0c;在哪里分配资源和时间&#xff0c;以及在事情超出计划或超出预算时要注意什么。 为了项目中获得成功&#xff0c;管理者需要在前期创建一个项目计划&#xff0c…

el-menu标题过长显示不全问题处理

项目基于vue-element-admin 问题 期望 处理方式 \src\layout\components\Sidebar\index.vue 文件后添加CSS <style scped> /* 侧栏导航菜单经典 文字超长溢出问题 CSS折行 */ .el-submenu__title {display: flex;align-items: center; } .el-submenu__title span {white-…

LeetCode题:931下降路径最小和

目录 一、题目要求 二、解题思路 &#xff08;1&#xff09;状态表示 &#xff08;2&#xff09;状态转移方程 &#xff08;3&#xff09;初始化 &#xff08;4&#xff09;填表顺序 &#xff08;5&#xff09;返回值 三、代码 一、题目要求 931. 下降路径最小和 给你…

【android开发-18】android中运行时申请权限详解

1&#xff0c;android权限机制 在Android中&#xff0c;权限机制是一种保护用户隐私和数据安全的重要机制。它允许应用程序在访问敏感或危险的数据或资源时获取特定的权限。以下是Android中权限机制的详细解释&#xff1a; 1&#xff0c;权限类别&#xff1a;Android将权限分…

自己搭建一个window系统上的MinIO系统(小白30分钟搞得版)

自己搭建一个window系统上的MinIO系统 前言实现系统说明 效果配置结果测试本地测试同一网络内的其他计算机访问 展望注参考链接 前言 有个项目使用到minio的云端存储系统&#xff0c;为了更好的理解项目&#xff0c;准备对这个“神秘的玩意”自己研究一下&#xff0c;看看到底…

【Pyqt5】QWidget: Must construct a QApplication before a QWidget

问题说明&#xff1a; pyqt6切换为pyqt5时&#xff0c;引用自定义类时报错&#xff0c;QWidget: Must construct a QApplication before a QWidget 解决办法 修改导入python包的导入顺序后可以正常运行 使用pyqt5时需将pyqtgraph放到pyqt5之后导入

idea__SpringBoot微服务03——yaml(新注解)(新的依赖)

yaml 一、数据格式二、注入配置文件&#xff08;yaml注入&#xff09;&#xff08;新注解ConfigurationProperties&#xff09;三、注入配置文件&#xff08;properties注入&#xff09;&#xff08;新注解PropertySource&#xff09;四、yaml配置文件占位符${}五 、yaml跟prop…

基于Springboot的任务发布平台设计与实现(源码齐全+调试)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。你想解决的问题&#xff0c;今天给大家介绍…

【Qt】QLineEdit显示输入十六进制,位数不足时按照规则填充显示及每两个字符以空格填充

问题 在实际开发中&#xff0c;有时候需要对输入进行限制&#xff0c;一是更加合理&#xff0c;二是防止出现误操作。 比如&#xff1a; 使用Qt进行应用程序开发时&#xff0c;对单行编辑框QLineEdit控件&#xff0c;设置只可输入十六进制。 限制输入的方式常用且经典的是使用…

鸿蒙开发—UI框架概述

基本概念 UI框架 HarmonyOS提供了一套UI开发框架&#xff0c;即方舟开发框架&#xff08;ArkUI框架&#xff09;。方舟开发框架可为开发者提供应用UI开发所必需的能力&#xff0c;比如多种组件、布局计算、动画能力、UI交互、绘制等。 方舟开发框架针对不同目的和技术背景的…

Redis中HyperLogLog的使用

目录 前言 HyperLogLog 前言 在学习HyperLogLog之前&#xff0c;我们需要先学习两个概念 UV&#xff1a;全称Unique Visitor&#xff0c;也叫独立访客量&#xff0c;是指通过互联网访问、浏览这个网页的自然人。1天内同一个用户多次访问该网站&#xff0c;只记录1次。PV&am…

AOSP开机动画调测技术点(基于Android13)

AOSP开机动画调测技术点(基于Android13) 开机动画替换 首先&#xff0c;在你的计算机上创建一个名为"bootanimation"的文件夹&#xff0c;并将"part0"、"part1"和"desc.txt"这三个文件复制到该文件夹中。这些文件包含了开机动画的图像…

易基因:人早期胚胎发育的表观遗传调控(染色质重塑+组蛋白修饰+DNA甲基化)|深度综述

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 哺乳动物发育研究促进了对协调胚胎发生遗传、表观遗传和细胞过程的理解&#xff0c;并揭示了对人类胚胎发生特异性新见解。最近研究生成了人类早期胚胎发生的第一个表观遗传学图谱&#…

继续研究超大规模数据场景的问题

关卡名 继续海量数据场景下的热门算法题 我会了✔️ 1. 对20GB文件进行排序 ✔️ 2. 超大文本中搜索两个单词的最短距离 ✔️ 3. 从10亿数字中寻找最小的100万个数字 ✔️ 1. 对20GB文件进行排序 题目要求&#xff1a;假设你有一个20GB的文件&#xff0c;每行一个字符串&…

什么是网站监控

在现今网络高度发展的时代中&#xff0c;网站是了解一家企业&#xff0c;个人最简单便捷的方式之一&#xff1b;个人查询资料信息也是需要通过网站。是与人们的生活密不可分。网站上面任何停机时间都可能直接导致收入损失和客户不满&#xff0c;这就也是为什么会出现网站监控服…

题目分析,高度理解一维二维数组的申请和[]是什么运算符

第0题: 动态申请二维数组并输出非负数和 和负数出现次数 思路:输入数组大小,然后申请内存并不对其初始化,提高速度,传入数据到申请的数组中,判断如果数组中有元素小于0对其进行计数,否则加上非0数最后输出答案,释放内存 第一题: 解答: 运行结果: 思路分析: 创建长度为20的…

C++ 教程 - 01

文章目录 C介绍环境配置第一个cpp程序案例练习 变量 C介绍 基于C语言&#xff0c;继承了C的所有语法&#xff1b; 静态类型语言&#xff0c;需要先编译&#xff0c;再执行&#xff1b; 贴近底层硬件&#xff0c;运行速度快&#xff1b; 支持面向对象、面向泛型&#xff0c…

一文读懂MySQL基础知识文集(8)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…