【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…

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

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

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

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

UE5 Http Server

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

结构体中内存的对齐

前言 学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. 什么…

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

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

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

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

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

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

【Linux】Git超详细教程:手把手教你(gitee版)--版本管理+远程仓库克隆(初学者必看!!!)

目录 一、前言 二、git 的深度理解 &#x1f95d; 什么是 git ? &#x1f347; git 的历史发展&#xff08;理解 git 的由来&#xff09; &#x1f34b; 感性理解 git 的版本管理 三、git 的安装 ✨Window 终端安装 ✨Linux 安装 四、git 的工作流程 五、如何在 Linux …

音视频开发—视频相关概念:YUV与RGB

文章目录 YUV相关概念组成部分优点常见的 YUV 格式数据量的计算YUV4:2:0 存储格式平面模式&#xff08;planar):打包模式&#xff08;packed&#xff09; RGB 和 YUV 的定义关系与转换RGB 到 YUV 的转换YUV 到 RGB 的转换 使用场景优缺点 YUV相关概念 YUV 是一种颜色编码格式&…

JVM-JAVA-类加载过程

JVM源码 类加载到 JVM 的过程通过 java 命令执行代码的流程 类加载到 JVM 的过程 在运行一个 main 函数启动程序是&#xff0c;首先需要类加载起把主类加载到 JVM 中 通过 java 命令执行代码的流程 loadClass的类加载过程有如下几步&#xff1a; 类被加载到方法区中后主要包…

Maven项目通过maven central 发布到中央仓库 https://repo.maven.apache.org/ 手把手教学 最新教学

一、注册maven central账号 ​ https://central.sonatype.com/publishing/namespaces 我这里直接使用github账号登录 &#xff0c;可以自己注册或者直接使用google账号或者github账号登录 这里github账号登录之后 应该只出现io.github 下面的io.gitee我也验证过 所以这里出…

Java时间类--JDK8

为什么JDK8会又新增时间相关类呢&#xff1f; ① JDK7的时间对象如果需要比较大小的话&#xff0c;必须都先转换成毫秒值&#xff1b;JDK8则不需要&#xff0c;可以直接比较。 ② JDK7的时间对象可以修改&#xff0c;在多线程环境下就会导致数据不安全&#xff1b;JDK8不能修改…

输入3个字符串,要求将字母按由小到大顺序输出

对于将3个整数按由小到大顺序输出&#xff0c;是很容易处理的。可以按照同样的算法来处理将3个字符串按大小顺序输出。可以直接写出程序。 编写程序&#xff1a; 运行结果&#xff1a; 这个程序是很好理解的。在程序中对字符串变量用关系运算符进行比较&#xff0c;如同对数值…

【Git 版本管理】合并 + 变更,看懂Git

看懂 Git 合并操作分离 HEAD分离 HEAD 测试 相对引用(^ || ~)操作符 ^相对引用 ^ 测试操作符 ~相对引用 ~ 测试 撤销变更Git ResetGit Revert撤销变更 测试 整理提交记录Git Cherry-pick测试 交互式 rebase交互式 rebase 测试 合并操作 关键字&#xff1a;commit、branch、merg…