【postgresql初级使用】视图上的触发器instead of,替代计划的rewrite,实现不一样的审计日志

instead of 触发器

专栏内容

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

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

文章目录

  • instead of 触发器
  • 概述
  • 机制原理
    • INSTEAD OF 触发器语法
    • INSTEAD OF 触发器执行步骤
    • 多触发器的优先级
  • 审计案例解析
    • 数据准备
      • 创建两张数据表
      • 创建视图
      • 创建执行函数
      • 创建触发器
    • 结果展示
      • 信息查看
      • 新员工入职
      • 变岗调薪
  • 总结
  • 结尾

概述


在postgresql 中,触发器与SQL标准相比,有一个扩展特性就是可以在视图上创建触发器。

在视图上的触发器类型是’INSTEAD OF`,可以在insert, update, delete事件的before或after进行触发,
本文就来详细分享一下,并通过一个实用的审计数据的案例来展示效果。

机制原理


下面先来介绍SQL语法,然后通过介绍它的执行过程,了解它的机制原理。

INSTEAD OF 触发器语法

视图触发器的创建语法如下:

CREATE TRIGGER trigger_name
INSTEAD OF [INSERT OR UPDATE OR DELETE]
ON table_name
FOR EACH ROW 
EXECUTE FUNCTION trigger_function;

在视图上的触发器,类型只有INSTEAT OF,而且它对应的触发器件有insert,update,delete,此处没有truncate事件。

另外,instead of 触发器也只能定义为行级触发器,这个原因下面会分析。

INSTEAD OF 触发器执行步骤

视图触发器执行的步骤如下

  • 当在视图上执行INSERT、UPDATE或DELETE操作时,如果为该视图定义了INSTEAD OF触发器,那么这些操作不会直接对视图或其基础表执行。
  • 相反地,INSTEAD OF触发器会代替这些操作执行。也就是说,对于需要修改的每一行,都会触发INSTEAD OF触发器。
  • 触发器的函数需要负责执行必要的修改到视图的基础表,并在适当的情况下返回修改后的行,以便在视图中显示。
  • 这允许开发者在不影响基础表结构的情况下,通过视图执行复杂的操作逻辑。

在这里插入图片描述

如果视图上没有INSTEAD OF触发器,那么对视图的操作必须被转换为对基础表的操作,是直接操作基础表。

多触发器的优先级

  • 除了INSTEAD OF触发器外,还可以在视图上定义在INSERT、UPDATE或DELETE操作之前或之后执行的触发器。
  • 但是,这些触发器只有在视图上也有INSTEAD OF触发器的情况下才会被触发。
  • 如果没有INSTEAD OF触发器,那么任何针对视图的SQL语句都必须被重写为影响基础表的语句,然后触发的是附加到基础表上的触发器。

审计案例解析


为了信息的安全,一般系统都会有审计这个功能,其中审计日志会把操作记录详细记录下来,会定期时行审计或者出问题时能够帮助回溯。

下面就来分享一个通过触发器实现的审计日志功能,大概设计如下:

  • 应用一般不会对物理表进行直接操作,而对给它们创建对应的视图,只看到部分数据;
  • 对于每个视图的操作事件,创建instead of类型的触发器;
  • 在视图触发器中,对于操作的类型,数据,以及操作者用户都记录到表中;

数据准备

创建两张数据表

  • 一张是数据信息表emp,记录员工的薪记信息;
  • 一张是审计数据表emp_audit, 记录操作类型,操作员,数据变动,以及时间。
CREATE TABLE emp (empname text PRIMARY KEY,salary integer
);
CREATE TABLE emp_audit(operation char(1) NOT NULL,userid text NOT NULL,empname text NOT NULL,salary integer,stamp timestamp NOT NULL
);

创建视图

CREATE VIEW emp_view AS
SELECT e.empname,e.salary,max(ea.stamp) AS last_updated
FROM emp e
LEFT JOIN emp_audit ea ON ea.empname = e.empname
GROUP BY 1, 2;

创建执行函数

  • 在delete时,先删除基础表的数据;如果删除成功,再插入审计表,操作类型为’D’,否则不操作审计表;
  • 在update时,同上,先更新基础表;如果成功,才插入审计表;
  • 在insert时,先插入基础表;然后操作审计表;
  • 每次都将操作时间更新为当前时间;
CREATE OR REPLACE FUNCTION update_emp_view() RETURNS TRIGGER AS $$
BEGINIF (TG_OP = 'DELETE') THENDELETE FROM emp WHERE empname = OLD.empname;IF NOT FOUND THEN RETURN NULL; END IF;OLD.last_updated = now();INSERT INTO emp_audit VALUES('D', current_user, OLD.*);RETURN OLD;ELSIF (TG_OP = 'UPDATE') THENUPDATE emp SET salary = NEW.salary WHERE empname = OLD.empname;IF NOT FOUND THEN RETURN NULL; END IF;NEW.last_updated = now();INSERT INTO emp_audit VALUES('U', current_user, NEW.*);RETURN NEW;ELSIF (TG_OP = 'INSERT') THENINSERT INTO emp VALUES(NEW.empname, NEW.salary);NEW.last_updated = now();INSERT INTO emp_audit VALUES('I', current_user, NEW.*);RETURN NEW;END IF;
END;
$$ LANGUAGE plpgsql;

创建触发器

在视图emp_view上创建instead of类型的触发器,使用上面定义的函数。

CREATE TRIGGER emp_auditINSTEAD OF INSERT OR UPDATE OR DELETE ON emp_viewFOR EACH ROW EXECUTE FUNCTION update_emp_view();

结果展示

测试一下审计模块的效果。

信息查看

员工管理系统中,对于薪资表结构如下:

postgres=> \d emp_viewView "senlleng.emp_view"Column    |            Type             | Collation | Nullable | Default
--------------+-----------------------------+-----------+----------+---------empname      | text                        |           |          |salary       | integer                     |           |          |last_updated | timestamp without time zone |           |          |
Triggers:emp_audit INSTEAD OF INSERT OR DELETE OR UPDATE ON emp_view FOR EACH ROW EXECUTE FUNCTION update_emp_view()

新员工入职

有新员工入职,录入新员工的薪资。

postgres=> insert into emp_view values('zhanglei', 10000);
INSERT 0 1
postgres=> insert into emp_view values('wangguo', 8000);
INSERT 0 1
postgres=> select * from emp_audit ;operation |  userid  | empname  | salary |           stamp
-----------+----------+----------+--------+----------------------------I         | senllang | zhanglei |  10000 | 2024-06-06 08:13:05.829596I         | senllang | wangguo  |   8000 | 2024-06-06 08:13:24.125127
(2 rows)

有两名新员工入职,可以看到是那个操作员录入的,并且当前录入的时间,信息都可以看到。

变岗调薪

当人员调岗时,对应的薪资也会发生变化;

或者人员离职时,需要删除对应的记录。

postgres=> update emp_view set salary = 7500 where empname='wangguo';
UPDATE 1
postgres=> delete from emp_view where empname='zhanglei';
DELETE 1
postgres=> select * from emp_audit ;operation |  userid  | empname  | salary |           stamp
-----------+----------+----------+--------+----------------------------I         | senllang | zhanglei |  10000 | 2024-06-06 08:13:05.829596I         | senllang | wangguo  |   8000 | 2024-06-06 08:13:24.125127U         | senllang | wangguo  |   7500 | 2024-06-06 08:14:30.737416D         | senllang | zhanglei |  10000 | 2024-06-06 08:14:53.089083
(4 rows)

当然审计表的权限是非常高的,只有在审计系统中才能查看,而且审计数据是不能删除的。

总结


在视图上的instead of 触发器,可以将原本的执行计划重写 替换为触发器执行,这样可以进行更为复杂的动作,这里以审计为例,演示了触发器的效果。

结尾


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

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

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

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

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

相关文章

Python私教张大鹏 Vue3整合AntDesignVue之Layout布局

案例&#xff1a;栅格布局 核心代码&#xff1a; <template><a-row><a-col :span"24">col</a-col></a-row><a-row><a-col :span"12">col-12</a-col><a-col :span"12">col-12</a-col…

国际货币基金组织警告:网络攻击影响全球金融稳定

近日&#xff0c;在一份关于金融稳定的报告中&#xff0c;国际货币基金组织&#xff08;IMF&#xff09;用了一章&#xff08;共三章&#xff09;的篇幅描述了网络攻击对金融环境的影响&#xff0c;并警告称&#xff0c;全球金融稳定正受到日益频繁和复杂的网络攻击的威胁。同时…

面试题react03

React事件机制&#xff1a; React的事件机制可以分为两个部分&#xff1a;事件的触发和事件的处理。事件的触发&#xff1a;在React中&#xff0c;事件可以通过用户与组件进行交互而触发&#xff0c;如点击、鼠标移动、键盘输入等。当用户与组件进行交互时&#xff0c;浏览器会…

每日题库:Huawe数通HCIA——14(30道)

所有资料均来源自网络&#xff0c;但个人亲测有效&#xff0c;特来分享&#xff0c;希望各位能拿到好成绩&#xff01; PS&#xff1a;别忘了一件三连哈&#xff01; 今日题库&#xff1a; 201. 如下图所示的网络&#xff0c;主机存在ARP缓存&#xff0c;主机A.发送数据包给…

Echarts 可视化图库案例(Make A Pie)

1、Made A Pie Made A Pie 2、可视化社区 &#xff08;Made A Pie 替代&#xff09; 可视化社区

产品创新管理:从模仿到引领,中国企业的创新之路

一、引言 在全球化竞争日益激烈的今天&#xff0c;科技创新已成为推动国家经济增长和社会进步的关键动力。中国自改革开放四十年来&#xff0c;在科技创新领域取得了举世瞩目的成就&#xff0c;从跟踪模仿到自主研发&#xff0c;再到自主创新、开放创新和协同创新并举&#xf…

【机器学习300问】110、什么是Lasso回归模型?

LASSO回归的全称是Least Absolute Shrinkage and Selection Operator&#xff0c;中文叫“最小绝对收缩和选择算子”&#xff0c;用一个比喻来初步感受一下它的作用&#xff1a; 想象你在整理一个杂乱无章的房间&#xff0c;里面堆满了各种物品&#xff08;代表众多的预测变量&…

【Vue】小兔鲜首页 - 拆分模块组件 - 局部注册

文章目录 一、分析二、局部注册 一、分析 小兔仙组件拆分示意图 开发思路 分析页面&#xff0c;按模块拆分组件&#xff0c;搭架子 (局部或全局注册) 根据设计图&#xff0c;编写组件 html 结构 css 样式 (已准备好) 拆分封装通用小组件 (局部或全局注册)&#xff0c;一般这…

arcgis如何给没有连通的路打交点

1、在打交点的时候需要先有图层&#xff0c;图层的构建流程如下所示 1、找到目录 2、先新建一个文件夹 3、在新建的文件夹下新建一个文件地理数据库 4、在文件地理数据库下&#xff0c;新建一个要素类数据集 5、在要素类数据集下进行数据导入&#xff0c;选择单个导入 6、在要…

据报道,FTC 和 DOJ 对微软、OpenAI 和 Nvidia 展开反垄断调查

据《纽约时报》报道&#xff0c;联邦贸易委员会 (FTC) 和司法部 (DOJ) 同意分担调查微软、OpenAI 和 Nvidia 潜在反垄断违规行为的职责。 美国司法部将牵头对英伟达进行调查&#xff0c;而联邦贸易委员会将调查 OpenAI 与其最大投资者微软之间的交易。 喜好儿网 今年 1 月&a…

胶南代理记账,为您提供专业、便捷的会计服务

欢迎来到胶南代理记账服务站&#xff0c;这里我们专注于为企业提供专业的会计服务&#xff0c;无论您是初创企业还是已经在业界有一定规模的企业&#xff0c;我们都将以最专业的态度和最高效的服务为您量身定制合适的记账方案。 我们的目标不仅是帮助您完成财务报告的制作&…

Diffusers代码学习: IP-Adapter

从操作的角度来看&#xff0c;IP-Adapter和图生图是很相似的&#xff0c;都是有一个原始的图片&#xff0c;加上提示词&#xff0c;生成目标图片。但它们的底层实现方式是完全不一样的&#xff0c;我们通过源码解读来看一下。以下是ip adapter的实现方式 # 以下代码为程序运行…

Python opencv读取深度图,网格化显示深度

效果图&#xff1a; 代码&#xff1a; import cv2 import osimg_path "./outdir/180m_norm_depth.png" depth_img cv2.imread(img_path, cv2.IMREAD_ANYDEPTH) filename os.path.basename(img_path) img_hig, img_wid depth_img.shape # (1080, 1920) print(de…

C# MemoryCache 缓存应用

摘要 缓存是一种非常常见的性能优化技术&#xff0c;在开发过程中经常会用到。.NET提供了内置的内存缓存类 MemoryCache&#xff0c;它可以很方便地存储数据并在后续的请求中快速读取&#xff0c;从而提高应用程序的响应速度。 正文 通过使用 Microsoft.Extensions.Caching.Me…

mqtt-emqx:设置遗嘱消息

【pom.xml】 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.3.12.RELEASE</version> </dependency> <dependency><groupId>org.eclipse…

OpenAI新成果揭秘语言模型神经活动:稀疏自编码器的前沿探索

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

搜索之道:信息素养与终身学习的新引擎

&#x1f4d1;前言 在这个信息如同潮水般涌来的时代&#xff0c;我们每天都在与海量的数据和信息打交道。无论是学习、工作还是生活&#xff0c;我们都渴望能够迅速、准确地找到我们所需的信息。然而&#xff0c;面对如此繁杂的信息海洋&#xff0c;如何高效、精准地搜索到我们…

【C语言训练题库】扫雷->简单小游戏!

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 目录 1. 题目 2. 解析 3. 代码 4. 小结 1. 题目 小sun上课的时候非常喜欢玩扫雷。他现小sun有一个初始的雷矩阵&#xff0c;他希望你帮他生成一个扫雷矩阵。 扫雷…

Matplotlib常见图汇总

Matplotlib是python的一个画图库&#xff0c;便于数据可视化。 安装命令 pip install matplotlib 常用命令&#xff1a; 绘制直线&#xff0c;连接两个点 import matplotlib.pyplot as plt plt.plot([0,5],[2,4]) plt.show() 运行结果如下&#xff1a; 多条线&#xff1a;…

巨擘之舞:探索AI大模型的发展历程与特性比较

巨擘之舞&#xff1a;探索AI大模型的发展历程与特性比较 文章目录 巨擘之舞&#xff1a;探索AI大模型的发展历程与特性比较引言1. GPT系列&#xff08;Generative Pre-trained Transformer&#xff09;发展历程优点缺点 2. BERT&#xff08;Bidirectional Encoder Representati…