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

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

 更改失败

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

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

相关文章

Elastcsearch:通过 Serverless 提供更多服务

作者:Ken Exner 人们使用 Elasticsearch 解决最大数据挑战的方式一直令我们感到惊讶。 从超过 40 亿次下载、70,000 次提交、1,800 名贡献者以及我们全球社区的反馈中可以清楚地看出这一点。 Elastic 在广泛的用例中发挥的作用促使我们简化复杂性,让搜索…

9.基于SpringBoot3+I18N实现国际化

1. 新建资源文件 在resources目录下新建目录i18n, 然后 新建messages_en.properties文件 user.login.erroraccount or password error!新建messages_zh_CN.properties文件 user.login.error帐户或密码错误!2. 新建LocaleConfig.java文件 Configurati…

gpt3、gpt2与gpt1区别

参考:深度学习:GPT1、GPT2、GPT-3_HanZee的博客-CSDN博客 Zero-shot Learning / One-shot Learning-CSDN博客 Zero-shot(零次学习)简介-CSDN博客 GPT-2 模型由多层单向transformer的解码器部分构成,本质上是自回归模型…

Hazelcast分布式内存网格(IMDG)基本使用,使用Hazelcast做分布式内存缓存

文章目录 一、Hazelcast简介1、Hazelcast概述2、Hazelcast之IMDG3、数据分区 二、Hazelcast配置1、maven坐标2、集群搭建(1)组播自动搭建 3、客户端4、集群分组5、其他配置 三、Hazelcast分布式数据结构1、IMap2、IQueue:队列3、MultiMap4、I…

MySQL和MongoDB简介以及它们之间的区别

本文主要介绍MySQL和MongoDB的简介以及它们之间的区别。 目录 MySQL简介MySQL的优缺点MySQL的应用场景MongoDB简介MongoDB的优缺点MongoDB的应用场景MySQL和MongoDB的区别 MySQL简介 MySQL是一种开源的关系型数据库管理系统,是世界上最流行的数据库之一。它支持多用…

基于Java SSM框架实现弹幕视频网站系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现弹幕视频网站系统演示 摘要 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,弹幕视频网站当然也不能排除在外。弹幕视频网站是以实际运用为开发背景&…

语义分割网络FCN

语义分割是一种像素级的分类,输出是与输入图像大小相同的分割图,输出图像的每个像素对应输入图像每个像素的类别,每一个像素点的灰度值都是代表当前像素点属于该类的概率。 语义分割任务需要解决的是如何把定位和分类这两个问题一起解决&…

强敌环伺:金融业信息安全威胁分析——钓鱼和恶意软件

门口的敌人:分析对金融服务的攻击 Akamai会定期针对不同行业发布互联网状态报告(SOTI),介绍相关领域最新的安全趋势和见解。最新的第8卷第3期报告主要以金融服务业为主,分析了该行业所面临的威胁和Akamai的见解。我们发…

SLAM算法与工程实践——SLAM基本库的安装与使用(1):Eigen库

SLAM算法与工程实践系列文章 下面是SLAM算法与工程实践系列文章的总链接,本人发表这个系列的文章链接均收录于此 SLAM算法与工程实践系列文章链接 下面是专栏地址: SLAM算法与工程实践系列专栏 文章目录 SLAM算法与工程实践系列文章SLAM算法与工程实践…

外包干了一个月,技术明显进步。。。。。

先说一下自己的情况,本科生生,19年通过校招进入南京某软件公司,干了接近3年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了3年的功能测试…

springcloud多环境部署打包 - maven 篇

背景 在使用 springboot 和sringcloudnacos开发项目过程中,会有多种环境切换,例如开发环境,测试环境,演示环境,生产环境等,我们通过建立多个 yml 文件结合 profiles.active 属性进行环境指定,但…

面试常问的dubbo的spi机制到底是什么?(下)

前文回顾 前一篇文章主要是讲了什么是spi机制,spi机制在java、spring中的不同实现的分析,同时也剖析了一下dubbo spi机制的实现ExtensionLoader的实现中关于实现类加载以及实现类分类的源码。 一、实现类对象构造 看实现类对象构造过程之前,先…

当使用RSA加密,从手机前端到服务器后端的请求数据存在+

将转成了空格,导致解密出错 将空格转成了

MySQL系列(二)——日志篇

一、有哪些日志 MySQL应该是我们用的最多,也算是最熟悉的数据库了。那么,MySQL中有哪些日志了,或者你知道的有哪些日志了? 首先,我们能接触到的,一般我们排查慢查询时,会去看慢查询日志。如果…

红队专题-开源资产扫描系统-ARL资产灯塔系统

ARL资产灯塔系统 安装说明问题 : 安装说明 源码地址 https://github.com/TophantTechnology/ARL https://github.com/TophantTechnology/ARL/wiki/Docker-%E7%8E%AF%E5%A2%83%E5%AE%89%E8%A3%85-ARL 安装环境 uname -a Linux VM-24-12-centos 3.10.0-1160.49.1.e…

Git多人协作(二)

个人主页:Lei宝啊 愿所有美好如期而遇 前言 上节:Git多人协作(一) 上次我们模拟了多人在一个分支上进行开发,并且是在远程直接新建的分支,而后我们本地进行拉取;本节我们将模拟多人分别在多分支上进行开发&#xf…

Azure Machine Learning - Azure OpenAI 服务使用 GPT-35-Turbo and GPT-4

通过 Azure OpenAI 服务使用 GPT-35-Turbo and GPT-4 环境准备 Azure 订阅 - 免费创建订阅已在所需的 Azure 订阅中授予对 Azure OpenAI 服务的访问权限。 目前,仅应用程序授予对此服务的访问权限。 可以填写 https://aka.ms/oai/access 处的表单来申请对 Azure Op…

网络基础入门---使用udp协议改进程序

目录标题 前言改进一:单词翻译程序准备工作transform函数的实现init_dictionary函数的实现transform函数的实现其他地方的修改测试 改进二:远程指令执行程序popenexecCommand函数实现测试 改进三:群聊程序Usr类onlineUser类adduserdelUserisO…

mixamo根动画导入UE5问题:滑铲

最近想做一个跑酷游戏,从mixamo下载滑铲动作后,出了很多动画的问题。花了两周时间,终于是把所有的问题基本上都解决了。 常见问题: 1.【动画序列】人物不移动。 2.【动画序列】人物移动朝向错误。 3.【蒙太奇】人物移动后会被拉回…

TensorRT Provider 与TensorRT Native的对比

TensorRT Provider 的优势为: TensorRT EP 可以实现与本机 TensorRT 的性能等价。使用 TensorRT EP 的好处之一是,如果模型中存在不受支持的 TensorRT 操作,就可以运行不能在本机 TensorRT 中运行的模型。这些操作将自动退回到其他 EP&#…