【postgresql初级使用】初识触发器,在数据行发生变化时自动执行用户行为,也可以SQL级别触发,特别是视图上可以有触发器了

初识触发器

专栏内容

  • postgresql使用入门基础
  • 手写数据库toadb
  • 并发编程

个人主页:我的主页
管理社区:开源数据库
座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.

文章目录

  • 初识触发器
  • 概述
  • 触发器的介绍
  • 触发器事件
    • 行级触发器
    • 语句级触发器
  • 触发器作用对象
    • 表对象触发器
    • 视图对象触发器
  • 触发器行为
  • 数据的可见性
  • 总结
  • 结尾

概述


在以前,每次入职新员工,HR就特别忙,要验收入职资料,还要找各负责人开通帐号,还要发好些通知,同时还要在各种类型的表格中填加一行新的内容,丝毫不敢马虎大意。

现在使用了数据库系统之后,这些事情就变得简单多了,只需要验收资料,录入新员工信息,其它就会自动触发,这就用到了触发器这一功能。

和其它商业数据库一样,在postgresql 中也支持触发器这一功能,那么什么是触发器呢,又有什么作用呢?

本节内容就是带大家认识一下触发器,以及触发器的作用。

触发器的介绍


触发器 (trigger) 顾名思义就是自动会触发的一种行为,类似于地雷,碰到了就会炸。

在postgresql 中,触发器以下内容组成:

  • 触发器定义的触发事件,在等谁来触发它;
  • 触发器作用对象,或者是应用的对象,也就是触发器安装到什么地方了;
  • 触发器的行为,也就是事件发生后,触发器如何炸,内部填充的内容又是什么;

下面就这两部分展开来聊一聊。

触发器事件


根据触发器事件类型的不同,分为两大类型,一种是行级事件;另一种是语句级的触发器。

下面来看它们有什么不同。

行级触发器

行级触发器(row-level triggers 或 per-row triggers), 对于每个数据行来说,它的变化行为有insert新增一行数据,update修改行数据的值,delete减少一行数据。

针对行数据的变化事件,都可以使触发器工作,每条变动的数据行都会触发,假如一条SQL语句删除了100行,那么就会触发100次。

当然触发器更加精准,还区分了事件发生前 Before,与事件发生后 after触发。

在这里插入图片描述

从图中可以看到,触发器是在执行修改的节点前后进行触发,每一行数据都会经过扫描节点,modify节点。

语句级触发器

语句级触发器(statement-level triggers 或 per-statement triggers), 是基于SQL语句事件来触发,也就是说无论每条SQL语句影响的数据行有多少,只触发一次。

当然语句级触发器也分事件发生前 Before,与事件发生后 after触发。

在这里插入图片描述

从图中可以看到,触发器是在整个SQL计划执行的节点前后进行触发,只经过一次,所以也就会只触发一次。

触发器作用对象


上面介绍了触发器的分类,那么触发器可以定义于那些数据库对象上面呢?

触发器可以作用于数据表(table),视图(view)以及外部表(foreign table), 这里特别提一下,postgresql 的触发器可以作用于视图上,这是非常实用的一点。

表对象触发器

可以附加到表(无论是否分区)和外部表上。

它们可以在INSERT、UPDATE、DELETE操作的beforeafter触发器,并且可以是针对每一行或每个SQL语句触发一次。

对于UPDATE触发器,还可以设置为仅当UPDATE语句的SET子句中提到某些列时才触发。

特别的,命令truncate将表文件截断,将表清空,只能定义为语句级触发器,因为它的执行发生在文件上,与数据行无关。

视图对象触发器

可以附加到视图上。这些触发器通常是INSTEAD OF触发器,意味着它们会替代对视图执行的INSERTUPDATEDELETE操作。

对于每个需要修改的视图行,都会触发一次INSTEAD OF触发器,也就是它只能是行级触发器。

触发器的函数负责在视图的基表上进行必要的修改,并(在适当时)返回修改后的行, 以视图中的形式表示。

此外,视图上也可以定义在每个SQL语句的beforeafter触发器,但这些仅在视图上的INSTEAD OF触发器时才会触发。

触发器行为


当触发器事件发生时(即满足触发条件的操作被执行时),触发器的函数会在适当的时间被调用以处理该事件。

这可能涉及修改数据、执行其他SQL语句、调用其他函数或存储过程等。

在postgresql 中,触发器的行为是一个用户自定义的函数,在事件触发时会自动调用此函数,执行对应函数中定义的行为。

数据的可见性


  1. 对于语句级触发器
  • BEFORE 语句级触发器不会看到由该语句所做的任何更改。
  • AFTER 语句级触发器会看到该语句所做的所有更改。
  1. 行级BEFORE触发器
  • 触发器函数中的SQL命令不会看到由该触发器即将进行的更改(例如,即将插入、更新或删除的行),因为这些更改尚未发生。
  • 它们会看到在本事务的前面命令处理的行所做的数据更改的效果。由于这些更改事件的顺序通常不可预测(一个影响多行的SQL命令可以以任何顺序访问这些行),因此需要谨慎处理。
  1. 行级AFTER触发器
  • 当行级AFTER触发器被触发时,本事务当前命令及之前命令,所有数据更改都已经完成,并且对这些更改的可见性适用于触发器函数。
  1. INSTEAD OF事件触发器
  • 在本事务中,INSTEAD OF触发器将看到由先前触发的INSTEAD OF触发器所做的数据更改的效果。
  1. 函数稳定性(Function stability)
  • 如果触发器函数是用标准过程语言编写的,并且被声明为VOLATILE,那么上述规则适用。
  • 如果函数被声明为STABLEIMMUTABLE,则它不会看到调用命令所做的任何更改。

总结


触发器在数据库中有很多用途,例如数据完整性检查、数据审计、自动更新相关表中的数据、防止无效数据进入数据库等。

它们提供了一种在数据库操作中自动执行特定任务的机制,从而减少了应用程序代码中的冗余和复杂性。

结尾


非常感谢大家的支持,在浏览的同时别忘了留下您宝贵的评论,如果觉得值得鼓励,请点赞,收藏,我会更加努力!

作者邮箱:study@senllang.onaliyun.com
如有错误或者疏漏欢迎指出,互相学习。

注:未经同意,不得转载!

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

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

相关文章

【成品设计】基于RT-thread星火开发板的智能监测系统设计

《基于RT-thread星火开发板的智能监测系统设计》 所需器件: 主控:STM32F407星火开发板。温湿度传感器:采集当前环境中的温湿度。环境传感器:采集当前环境中的光照强度。CO2传感器,采集当前环境中的C02浓度。粉尘传感…

excel怎么对非数字求和汇总?

如:学生小王的成绩为:A,A,A,A,B,B-……想得到的成绩汇总求和为:2A,2A,1B,1B- 如果在低版本里,用公式计算可能相当复杂,但是有了TEXTJOIN函数和UNIQUE函数&…

校园交友|基于SprinBoot+vue的校园交友网站(源码+数据库+文档)

校园交友网站 目录 基于SprinBootvue的校园交友网站 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2后台功能模块 5.2.1管理员功能模块 5.2.2用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#x…

AKG K450配什么前端:深度解析与最佳搭配指南

AKG K450配什么前端:深度解析与最佳搭配指南 在音频世界里,选择一款合适的前端设备对于耳机音质的发挥至关重要。AKG K450作为一款备受好评的耳机,其音质细腻、低频饱满,但要想真正发挥其潜力,就需要找到一款与之相匹…

CSS学习笔记:bootstrap的介绍、下载、使用及响应式布局的实现

介绍 Bootstrap 是由 Twitter 公司开发维护的前端 UI 框架,它提供了大量编写好的CSS 样式 bootstrap过时了吗? 其实在学bootstrap这一部分的网课时,在弹幕上看到一些同学说bootstrap已经过时了,这里谈谈我的看法 我的前端学习…

3天13部,端午档电影数何以是五一档2倍?

离端午还有12天,院线端午档再上热搜。 截止至5月29日,本次端午档将有13部电影在3天的节假日内集中上映,这一数量仅比2021年端午档的最高纪录少了2部,几乎是今年五一档期上映影片数量(7部)的两倍。 并且与…

使用OpenCV创建全景图像

使用OpenCV创建全景图像 前言图像拼接策略创建全景图像相关链接前言 在本节中,我们将学习组合多个图像来创建全景图像。使用相机拍摄全景照片时,通常会拍摄多张照片,通过算法将这些图像中共同存在的元素(从左到右)映射到一张单独的图像中。为了执行图像的拼接,将利用 cv2 …

UE5 Http Server

前言 最近要用UE 作为一个服务器去接收来自外部的请求,从而在UE中处理一些内容,但是之前只做过请求,哪整过这玩意,短期内还得出结果,那怎么搞嘞,本着省事的原则就找找呗,有没有现成的&#xff0…

计算机网络- 特定服务类型(Type of Service, TOS) 服务质量(Quality of Service, QoS)

特定服务类型(Type of Service, TOS) 具有特定服务类型(Type of Service, TOS)的数据包是指在IP头部中包含特定TOS字段设置的数据包。TOS字段用于指示数据包的服务质量要求,如延迟、吞吐量、可靠性等。现代IP网络通常…

结构体中内存的对齐

前言 学C的同学应该知道~ 想精通C语言就不得不面对—指针与内存 续上次指针进阶&#xff0c;这一章我来聊一聊C语言内存对齐的问题 学习结构体的你有没有注意过结构体向系统申请的内存为多少呢的&#x1f601; 思考 #include<stdio.h> typedef struct s1 {char a;char …

Qt6同时使用Qt3DCore与QtGUI时QTransform类冲突问题

在Qt GUI模块有一个QTransform类&#xff0c;在Qt3D Core模块也有一个QTransform类&#xff0c;如果不特殊指定一下会报错

全新/二手KEITHLEY 2400 数字万用表

吉时利Keithley 2400数字源表&#xff0c;200V&#xff0c;1A&#xff0c;20W Keithley 2400 源表是一款 20W 仪器&#xff0c;可输出和测量 5V&#xff08;输出&#xff09;和 1V&#xff08;测量&#xff09;至 200V DC 的电压以及 10pA 至 1A 的电流。该万用表功能包括高重复…

【linux深入剖析】进程间通信

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1.进程间通信目的2. 什么…

layui实现鼠标移入/移出时显示/隐藏tips

layui实现鼠标移入/移出时显示/隐藏tips弹窗 注&#xff1a;其它弹窗亦可按照此方法实现相同效果 鼠标移入 dom 或 tips 区域&#xff0c;显示 tips 弹窗&#xff1b; 鼠标移出 dom 或 tips 区域&#xff0c;隐藏 tips 窗口&#xff1b; <div id"box">鼠标移入…

如何发布自己的 npm 包

创建 npm 包项目 创建项目目录&#xff1a; 在本地创建一个新的项目目录&#xff0c;并进入该目录。 初始化项目&#xff1a; 在命令行中运行以下命令初始化 npm 项目&#xff1a; npm init 按照提示填写项目信息&#xff0c;包括包名、版本、描述等。 编写代码 在项目目录…

react 怎样向ant table添加按钮,以及文本溢出隐藏?

这些都是一些组件自带的方法&#xff0c;只不过是不知道该怎么用&#xff0c;上面的内容可以直接拿去用&#xff0c;&#xff08;事件除外&#xff0c;要自己绑&#xff0c;还有引入的组件&#xff09;&#xff01;

Go常见的语法题目

1、下面代码能运行吗&#xff1f;为什么。 type Param map[string]interface{}type Show struct {Param }func main1() {s : new(Show)s.Param["RMB"] 10000 }解析 共发现两个问题&#xff1a; main 函数不能加数字。new 关键字无法初始化 Show 结构体中的 Param…

数据结构:栈和队列的练习题1(括号匹配问题)

题目描述&#xff1a; 思路&#xff1a;我们首先可以把出现的情况大致分为以下几类&#xff1a; 因为涉及匹配问题&#xff0c;所以所有的左括号和右括号肯定要分开来整理。如果我们直接去匹配的话&#xff08;像第一行的从左到右独立匹配&#xff09;是行得通的&#xff0c;但…

C/C++|我们为什么应该使用 `std::make_shared` 创建 `std::shared_ptr`

std::make_shared 是 C11 引入的一个工厂函数&#xff0c;用于创建 std::shared_ptr。与直接使用 new 并将其传递给 std::shared_ptr 构造函数相比&#xff0c;std::make_shared 提供了一种更高效、更安全的方法来分配和管理动态内存。 前置知识1&#xff1a; 当我们调用诸如&a…

关于d3js生成节点画布的个人笔记

实现功能 根据鼠标位置生成节点根据节点位置通过鼠标拖拽生成连线实现自定义线段颜色功能删除节点以及连线功能实现单个节点拖动功能实现整条线路的拖动功能 界面如下&#xff1a; 主要模块介绍 绘制连线 const line svg.selectAll(".line").data(links, d >…