【postgresql初级使用】初识触发器,在数据行发生变革时主动实行用户举动, ...

打印 上一主题 下一主题

主题 526|帖子 526|积分 1578

初识触发器

   ​专栏内容
  

  • 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操纵的before或after触发器,而且可以是针对每一行或每个SQL语句触发一次。
对于UPDATE触发器,还可以设置为仅当UPDATE语句的SET子句中提到某些列时才触发。
特殊的,下令truncate将表文件截断,将表清空,只能界说为语句级触发器,因为它的实行发生在文件上,与数据行无关。
视图对象触发器

可以附加到视图上。这些触发器通常是INSTEAD OF触发器,意味着它们会替换对视图实行的INSERT、UPDATE或DELETE操纵。
对于每个需要修改的视图行,都会触发一次INSTEAD OF触发器,也就是它只能是行级触发器。
触发器的函数负责在视图的基表上举行须要的修改,并(在得当时)返回修改后的行, 以视图中的情势表示。
此外,视图上也可以界说在每个SQL语句的before或after触发器,但这些仅在视图上的INSTEAD OF触发器时才会触发。
触发器举动


当触发器事件发生时(即满意触发条件的操纵被实行时),触发器的函数会在得当的时间被调用以处理该事件。
这可能涉及修改数据、实行其他SQL语句、调用其他函数或存储过程等。
在postgresql 中,触发器的举动是一个用户自界说的函数,在事件触发时会主动调用此函数,实行对应函数中界说的举动。
数据的可见性



  • 对于语句级触发器


  • BEFORE 语句级触发器不会看到由该语句所做的任何更改。
  • AFTER 语句级触发器会看到该语句所做的所有更改。

  • 行级BEFORE触发器


  • 触发器函数中的SQL下令不会看到由该触发器即将举行的更改(比方,即将插入、更新或删除的行),因为这些更改尚未发生。
  • 它们会看到在本领件的前面下令处理的行所做的数据更改的结果。由于这些更改事件的顺序通常不可预测(一个影响多行的SQL下令可以以任何顺序访问这些行),因此需要审慎处理。

  • 行级AFTER触发器


  • 当行级AFTER触发器被触发时,本领件当前下令及之前下令,所有数据更改都已经完成,而且对这些更改的可见性适用于触发器函数。

  • INSTEAD OF事件触发器


  • 在本领件中,INSTEAD OF触发器将看到由先前触发的INSTEAD OF触发器所做的数据更改的结果。

  • 函数稳固性(Function stability)


  • 如果触发器函数是用尺度过程语言编写的,而且被声明为VOLATILE,那么上述规则适用。
  • 如果函数被声明为STABLE或IMMUTABLE,则它不会看到调用下令所做的任何更改。
总结


触发器在数据库中有很多用途,比方数据完备性检查、数据审计、主动更新相关表中的数据、防止无效数据进入数据库等。
它们提供了一种在数据库操纵中主动实行特定任务的机制,从而减少了应用程序代码中的冗余和复杂性。
结尾


   非常感谢各人的支持,在欣赏的同时别忘了留下您名贵的评论,如果以为值得鼓励,请点赞,收藏,我会更加努力!
  作者邮箱:study@senllang.onaliyun.com
如有错误大概疏漏欢迎指出,互相学习。
注:未经同意,不得转载!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

忿忿的泥巴坨

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表