什么是触发器?

触发器 前言: 我们已经实现了加减法,如果计算机要计算1+2+3,必须得先计算1+2,然后再把1+2得结果存起来,在去计算3+3. 那么如何保存这个临时数据呢?   1.触发器触发器(Flip Flop)是一种可以存储电路状态的电子元件。最简单的是由两个或非门,两个输入端和两个输出端组成的RS触发器触发器的电路图由逻辑门组合而成,其结构均由R-S锁存器派生而来(广义的触发器包括锁存器)。触发器... 阅读详情

在 SQL Server 数据库管理中,触发器能够在特定的数据库操作发生时自动执行预先定义的 SQL 语句。触发器可以用于实现数据完整性约束、审计跟踪、复杂的业务逻辑等多种功能。本文将深入探讨 SQL Server 触发器(trigger)的概念、类型、工作原理以及实际应用,并通过代码示例进行演示。

触发器的概念

触发器(trigger)是SQL server提供给程序员和数据分析员用来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发。当对一个表进行插入(INSERT)、更新(UPDATE)或删除(DELETE)操作时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。

触发器与存储过程的区别是运行方式的不同,触发器不能执行EXECUTE语句调用,而是在用户执行 Transact-SQL 语句时自动触发执行,而存储过程需要用户,应用程序或者触发器显示地调用并执行,这是两者最明显的区别。

例如,当一个新的订单被插入到订单表中时,可以使用触发器自动更新库存表中的库存数量,以确保库存不会出现负数。或者,当一个员工的工资被更新时,可以使用触发器记录工资变更的历史记录,以便进行审计。

触发器的作用

触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂参照完整性和数据的一致性,它能够对数据库中的相关表进行级联修改,提高比CHECK约束更复杂的的数据完整性,并自定义错误消息。触发器的主要作用主要有以下几个方面:

  1. 强制数据库间的引用完整性
  2. 级联修改数据库中所有相关的表,自动触发其它与之相关的操作
  3. 跟踪变化,撤销或回滚违法操作,防止非法修改数据
  4. 返回自定义的错误消息,约束无法返回信息,而触发器可以
  5. 触发器可以调用更多的存储过程

触发器的类型

Sql Server 通常包括三种常规类型的触发器: DML触发器、DDL触发器和登录触发器。

DML 触发器

DML(数据操作语言,Data Manipulation Language)触发器是一些附加在特定表或视图上的操作代码,当数据库服务器中发生数据操作语言事件(如 INSERT、UPDATE 和 DELETE)时执行这些操作。

当遇到下列情形时,应考虑使用DML触发器:

  1. 通过数据库中的相关表实现级联更改
  2. 防止恶意或者错误的insert、update和delete操作,并强制执行check约束定义的限制更为复杂的其他限制。
  3. 评估数据修改前后表的状态,并根据该差异才去措施。

根据触发的时机,DML 触发器又可以分为以下两种:

  1. AFTER 触发器:在触发 DML 操作(INSERT、UPDATE 或 DELETE)完成后触发。AFTER 触发器可以用于检查数据的完整性、执行额外的业务逻辑或记录数据变更的历史记录。
  2. INSTEAD OF 触发器:在触发 DML 操作被执行之前触发,并替代原始的 DML 操作。INSTEAD OF 触发器可以用于实现复杂的业务逻辑,例如在特定条件下阻止数据的插入、更新或删除,或者将数据插入到其他表中。
DDL 触发器

DDL(数据定义语言,Data Definition Language)触发器是在服务器或者数据库中数据定义语言(主要是以

CREATE,DROP,ALTER开头的语句)作用于数据库对象(如表、视图、存储过程等)时触发的,使用DDL触发器可以防止意外的数据库结构变更或记录数据中的更改或事件操作。

登录触发器

登录触发器将为响应 LOGIN 事件而激发存储过程。SQL Server身份验证阶段完成之后且用户会话实际建立之前激发。因此,来自触发器内部且通常将到达用户的所有消息(例如错误消息和来自 PRINT 语句的消息)会传送到 SQL Server 错误日志。如果身份验证失败,将不激发登录触发器。

按照特殊的执行方式又可以分为:嵌套触发器、递归触发器。

嵌套触发器

概念

嵌套触发器是指一个触发器在执行过程中触发了另一个触发器的情况。SQL Server 允许触发器进行嵌套调用,但可以通过数据库选项来控制嵌套的层数。

工作原理

当一个数据操作(如 INSERT、UPDATE 或 DELETE)触发了一个表上的触发器时,如果这个触发器的执行又导致了另一个表上的数据操作,并且该表上也有触发器,那么就可能会发生嵌套触发。

例如,有两个表 TableA 和 TableB,在 TableA 上有一个触发器 TriggerA,当对 TableA 进行数据操作时触发了 TriggerA。而 TriggerA 的执行过程中对 TableB 进行了数据操作,TableB 上有触发器 TriggerB,此时就发生了嵌套触发。

配置与限制

在 SQL Server 中,可以通过数据库选项“nested triggers”来控制是否允许嵌套触发器以及嵌套的层数。默认情况下,该选项是开启的,允许嵌套触发器,但可以设置为关闭以禁止嵌套触发或限制嵌套的层数。

如果嵌套层数过多,可能会导致性能问题和复杂的调试情况。

递归触发器

概念

递归触发器是一种特殊的触发器,它允许一个表上的触发器在执行过程中再次触发自身。这可以用于处理一些具有递归性质的数据操作。

工作原理

当对一个表进行数据操作时,触发了该表上的触发器。如果这个触发器的执行又导致了对同一个表的相同类型的数据操作,并且数据库选项“recursive triggers”是开启的,那么就会再次触发这个触发器,形成递归调用。

例如,有一个表 TableC,上面有一个触发器 TriggerC。当对 TableC 进行数据操作时触发了 TriggerC,而 TriggerC 的执行过程中又对 TableC 进行了数据操作,此时如果递归触发器选项开启,TriggerC 会再次被触发。

配置与应用场景

可以通过数据库选项“recursive triggers”来控制是否允许递归触发器。默认情况下,该选项是关闭的。

递归触发器的应用场景相对较少,通常用于处理一些具有层次结构或递归关系的数据,例如组织架构表中上下级关系的更新等。但在使用递归触发器时需要特别小心,因为如果递归没有正确控制,可能会导致无限循环,从而消耗大量的系统资源甚至使数据库陷入死锁。

在使用嵌套触发器和递归触发器时需要谨慎考虑其性能影响和潜在的复杂性,确保数据库的稳定和高效运行。

触发器的工作原理

触发器触发时

  1. 系统自动在内存中创建deleted表或inserted表;
  2. 只读,不允许修改,触发器执行完成后,自动删除。

inserted表

  1. 临时保存了插入或更新后的记录行;
  2. 可以从inserted表中检查插入的数据是否满足业务需求;
  3. 如果不满足,则向用户发送报告错误消息,并回滚插入操作。

deleted表

  1. 临时保存了删除或更新前的记录行;
  2. 可以从deleted表中检查被删除的数据是否满足业务需求;
  3. 如果不满足,则向用户报告错误消息,并回滚插入操作。

Update操作时

新的记录存入inserted表,旧的记录存入deleted表。

触发器的创建和使用

创建 DML 触发器

以下是创建一个 AFTER INSERT DML 触发器的示例代码,用于在订单表中插入新订单后自动更新库存表中的库存数量:

在这里插入图片描述

商品1的原始库存为751

在这里插入图片描述

向订单表中插入一条订单,下单10个商品1

在这里插入图片描述

执行完插入语句后,查看库存表可以发现商品1的数量自动减10

在这里插入图片描述

在这个示例中,我们创建了一个名为UpdateInventory的触发器,它在Orders表上的 INSERT 操作完成后触发。触发器中的 SQL 语句用于更新库存表中的库存数量,将库存数量减去新插入订单中的数量。

创建 DDL 触发器

以下是创建一个 DDL 触发器的示例代码,用于记录数据库结构变更的历史记录:

在这里插入图片描述

在这个示例中,我们创建了一个名为AuditDDLChanges的触发器,它在数据库级别上的CREATE_TABLEALTER_TABLEDROP_TABLE操作发生时触发。触发器中的 SQL 语句用于将数据库结构变更的事件类型、对象名称和事件发生的日期插入到一个名为DDLChangeLog的表中,以便进行审计跟踪。

使用 INSTEAD OF 触发器

以下是创建一个 INSTEAD OF INSERT 触发器的示例代码。请注意:MySQL 中没有直接等同于 SQL Server 的INSTEAD OF INSERT触发器,我这里使用BEFORE INSERT触发器来实现类似的逻辑控制。用于在特定条件下阻止数据的插入:

在这里插入图片描述

在这里插入图片描述

在这个示例中,我们创建了一个名为PreventInsert的触发器,它在orders表上的 INSERT 操作被执行之前触发。触发器中的 SQL 语句用于检查插入的订单中的数量是否小于等于零,如果是,则抛出一个错误消息,阻止数据的插入;如果不是,则将插入的数据插入到订单表中。

触发器的优点和缺点

优点

  1. 数据完整性:触发器可以在数据库层面实现数据完整性约束,确保数据的一致性和准确性。例如,可以使用触发器检查插入或更新的数据是否符合特定的业务规则,如必填字段、数据范围等。
  2. 自动化业务逻辑:触发器可以自动执行复杂的业务逻辑,减少手动编码的工作量。例如,可以使用触发器在数据插入、更新或删除时自动更新相关表中的数据,或者发送通知邮件等。
  3. 审计跟踪:触发器可以用于记录数据变更的历史记录,以便进行审计跟踪。例如,可以使用触发器将数据变更的操作类型、操作时间、操作人员等信息记录到一个审计表中。

缺点

  1. 性能影响:触发器的执行会增加数据库的负担,特别是在频繁发生数据修改操作的情况下,可能会影响数据库的性能。因此,在设计触发器时,需要考虑其对性能的影响,并尽量减少不必要的触发器。
  2. 复杂性增加:触发器的使用会增加数据库的复杂性,特别是在多个触发器相互作用的情况下,可能会导致难以调试的问题。因此,在设计触发器时,需要考虑其对数据库架构的影响,并尽量保持数据库的简洁性。
  3. 可维护性降低:触发器的修改和维护可能会比较困难,特别是在触发器的逻辑比较复杂的情况下。因此,在设计触发器时,需要考虑其可维护性,并尽量使用简单、清晰的逻辑。

总结

触发器是可以在特定的数据库事件发生时自动执行预先定义的 SQL 语句。通常用于实现数据完整性约束、审计跟踪、复杂的业务逻辑等多种功能。然而,触发器的使用也需要谨慎,因为它们可能会增加数据库的复杂性和性能负担。在设计和使用触发器时,需要考虑其对数据库架构、性能和可维护性的影响。


Chat2DB 文档:https://docs.chat2db.ai/zh-CN/docs/start-guide/getting-started

Chat2DB 官网:https://chat2db.ai/zh-CN

Chat2DB GitHub:https://github.com/codePhiliaX/Chat2DB

数电中的各类触发器 文章目录1.RS触发器2.JK触发器3.T触发器4.D触发器 1.RS触发器 RS触发器为典型的电平式触发器,基本结构是由两个与非门的输入、输出端交叉连接而成。 一定要牢记RS触发器的约束条件:R+S=1 2.JK触发器 JK触发器属于脉冲触发方式,触发翻转只在时钟脉冲的负跳变沿发生,严格上来说,T触发器其实是JK触发器的一种特殊类型。 3.T触发器 T触发器是在数字电路中,凡在CP时钟脉冲控制下,根据输入信号T取值的不同,具有保持和翻转功能的触发器,即当T=0时能保持状态不变,当T=1时一定翻转的 阅读详情

相关推荐

数据库系统概论—触发器

(1)只有表的拥有者,即创建表的用户才可以在表上创建触发器,并且一个表上只能创建一定数量的触发器触发器的具体数量由具体的关系数据库管理系统在设计时确定。(2)触发器触发器名可以包含模式名,也可以不包含模式名。同一模式下,触发器名必须是唯的,并且触发器名和表名必须在同一模式下。(3)表名触发器只能定义在基本表上,不能定义在视图上。当基本表的数据发生变化时,将激活定义在该表上相应触发事件的触发器,因此该表也称为触发器的目标表。(4)触发事件。

2301_76270566的博客 2241

「数字电子技术基础」6.触发器

触发器(Flip-Flop),从英语单词来看就是“翻转器”的意思。按照触发的条件不同,可以将触发器分为无触发、电平触发(时钟触发)、脉冲触发、边沿触发。按照逻辑功能可以分为RS、JK、D、T触发器

weixin_43014010的博客 4万+

IC基础知识(十五)RS触发器、JK触发器、D触发器、T触发器

RS触发器、JK触发器、D触发器、T触发器介绍

Andy_ICer的博客 3万+

[硬件基础]-快速了解触发器

触发器是制造存储器件和数字逻辑电路的最重要主题之一。 在本文中,我将讨论触发器的基础知识、带有逻辑图和真值表的触发器类型、触发器的工作原理及其应用。

视觉与物联智能 5781

RS触发器、D触发器、JK触发器、T,T‘触发器的功能详细总结

在实际的数字系统中往往包含大量的存储单元,而且经常要求他们在同一时刻同步动作,为达到这个目的,在每个存储单元电路上引入一个时钟脉冲(CLK)作为控制信号,只有当CLK到来时电路才被“触发”而动作,并根据输入信号改变输出状态。把这种在时钟信号触发时才能动作的存储单元电路称为触发器,以区别没有时钟信号控制的锁存器。 根据逻辑功能的不同特点,把触发器分为RS、JK、T、D等几种类型。 ①首先我们介绍RS触发器(与非门) 这种触发器可以实现的功能有三种:1、输出置零 2、输出置一 3、输出保持不变 下面附上

python_baichi的博客 9万+

边沿触发器(T触发器)

使用目的: 提高可靠性,增强抗干扰能力,希望触发器的次态仅取决于CLK的下降沿(或上升沿)到来时的输入信号状态,与在此前、后输入的状态没有关系。 【 1. 上升沿触发器 】 用两个电平触发D触发器组成的边沿触发器 电路结构 电路原理 即: 由两个D电平触发器组成(D电平触发器的输出=其输入) CLK=1时,D电平触发器正常工作,CLK=0时,D电平触发器会锁存其变为0前瞬...

普罗米修斯的博客 3万+

触发器(基本的SR触发器、同步触发器、D触发器

一、能够存储1位二值信号的基本单元电路统称为触发器(Filp-Flop)   触发器是构成时序逻辑电路的基本逻辑部件。它有两个稳定状态:“0”和“1”。在不同的输入情况下,它可以被置0状态或1状态,当输入信号消失后,所置成的状态能够保持不变。所以触发器可以记忆1位二值的信号。根据逻辑功能的不同,触发器可以分为SR触发器、D触发器、JK触发器、T和T'触发器。按照结构形式的不同,又可分基...

aodan3459的博客 6306

数电模电(三) 时序电路触发器 基本RS触发器 同步RS触发器 主从RS触发器 JK触发器 主从D触发器

数字电子技术和模拟电子技术中的 时序电路触发器 基本RS触发器 同步RS触发器 主从RS触发器 JK触发器 主从D触发器 总结

Designer 小郑的技术博客 2万+

SQL 触发器

sql server 触发器学习内容(2012版本数据库)

paoe1612205661的博客 1万+

脉冲触发的触发器(主从触发器

脉冲触发的动作特点:(1)触发器的翻转分两步动作。第一步:当CLK以高电平为有效信号时,在CLK= 1期间主触发器接收输入端(S、R或J、K)的信号,被置成相应的状态,而从触发器不动。第二步: CLK下降沿到来时从触发器按照主触发器的状态翻转,所以Q、Q’端状态的改变发生在CLK的下降沿。( 若CLK以低电平为有效信号,则Q和Q’状态的变化发生在CLK的上升沿。( 2)因为主触发器本身是一个电平触发SR触发器,所以在CLK=1的全部时间里输入信号都将对主触发器起控制作用。

qq_45766606的博客 1万+

T触发器和T‘触发器

数字电子基础(数字逻辑) —— 触发器 —— T & T' 触发器

m0_74209563的博客 7147

触发器总结

定义 电路除了需要实现逻辑运算的逻辑门外还需要保存信息的器件,出发就是具有记忆功能的电子器件 特点 1.有两个互补的输出端 2.有两个稳定状态,1状态为=1,=0;0状态为=0,=1只要输入信号不变,触发器状态不变 3.在一定的输入信号作用下出发可以从一个状态变成另一个状态 分类 R-S触发器、D触发器、J-K触发器、T触发器 效果 一、R-S触发器 1.结构 (与非门构成的基本R-S触发器) 2.符号 (与非门构成的基本R-S触发器) 3.功能(速记:看R,R为0就置0,R为1

sksunkailing的博客 7255

触发器(SR锁存器、SR触发器、JK触发器、D触发器、T触发器

在各种复杂的数字电路中,不但需要对二值信号进行算术运算和逻辑运算,还经常需要将这些信号和运算结果保存起来。为此,需要使用具有记忆功能的基本逻辑单元。能够存储1位二值信号的基本单元电路统称为触发器(Flip-Flop)。 为了实现记忆1位二值信号的功能,触发器必须具备以下两个基本特点: A:具有两个能自行保持的稳定状态,用来表示逻辑状态的0和1,或二进制数的0和1. B:在触发信号的操作下,根据不同的输入信号可以置成0或1状态。 由于采用的电路结构形式不...

ellle_welcome的专栏 8704

PostgreSql 触发器

PostgreSQL从9.3 版开始支持一种称为"Event Trigger"的触发器,这种触发器主要用于弥补PostgreSQL 以前版本不支持 DDL 触发器的不足。由于事件触发器涉及的权限较大,比如能禁止 DDL 操作等,所以只有超级用户才能创建和修改事件触发器。目前,事件触发器支持以下 3 种 DDL 事件。:DDL开始执行前被触发。:一个DDL执行完成后被触发。sql_drop:删除数据库对象前被触发。

脑子进水养啥鱼?的博客 8838

触发器的分类

基本触发器:★与非门组成基本触发器,或非门组成基本触发器;同步触发器:★同步RS触发器,★同步D触发器;主从触发器:★主从RS触发器,★主从JK触发器;边沿触发器:★边沿D触发器,★边沿JK触发器;施密特触发器:★用555定时器构成的施密特触发器;单稳态触发器:用555定时器构成的单稳态触发器。  双稳态器件有两类:一类是触发器,一类是锁存器。锁存器是触发器的原始形

kx 7103

锁存器/触发器的总结

1.触发方式分类(1) 按逻辑功能:RS触发器/SR触发器D触发器JK触发器T触发器(2) 按触发方式:电平触发器边沿触发器主从触发器(3) 按电路结构:基本RS触发器CLK钟控触发器(4) 按存储数据:静态触发器动态触发器 (1) 按逻辑功能: RS触发器/SR触发器 1.RS触发器与SR触发器的区别在优先级 RS触发器当置位和复位信号均为1时,SR变化后,输出为1,置位优先, SR触发器当置位...

小檬 6261

postgreSQL触发器

触发器是某个数据库操作发生时被**自动调用的函数**。可以在`INSERT`、`UPDATE`或`DELETE`操作之前或之后调用触发器。`PostgreSQL`支持两种类型的触发器,一种是**数据行级触发器**,另外一种是**语句级触发器**。对于数据行级的触发器,触发发触发器的语句每操作一个数据行,它就被执行一次。对于语句级的触发器,它只会被执行一次。

qq_25775675的博客 5774
上一篇: 如何高效使用索引——10个索引优化最佳指南
下一篇: 如何分析和优化SQL性能:深入解析EXPLAIN语句
Chat2DB
博客等级 码龄3年 139粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值