PostgreSQL中事件触发器Event Trigger
在PostgreSQL中,事件触发器(Event Trigger)是一种特殊的触发器类型,它允许你在特定的数据库系统事件发生时执行特定的操作。与普通的触发器不同,事件触发器并不与特定的表或视图相关联,而是与数据库级别的全局事件相关联。
参考官方文档如下
https://www.postgresql.org/docs/16/functions-event-triggers.html
事件触发器的特点
- 全局作用:事件触发器作用于整个数据库实例,而不是单个表或视图。
- 系统事件:它们响应的是数据库系统级的事件,如DDL(数据定义语言)命令的执行、配置参数的更改、日志文件的切换等。
- 灵活性:可以定义复杂的响应逻辑,通过PL/pgSQL、PL/Tcl、PL/Perl等过程语言来实现。
事件触发器的使用场景
- 审计和日志记录:记录所有DDL操作的日志,以便进行审计或回滚。
- 安全策略实施:防止未经授权的DDL更改,或确保在更改前满足某些条件。
- 自动化任务:在数据库达到特定条件时自动执行维护任务,如清理日志、备份等。
事件触发器的创建
创建事件触发器需要两个步骤:
- 定义触发器函数:这个函数将包含事件发生时需要执行的逻辑。
- 创建事件触发器:将这个触发器函数与一个或多个特定的事件关联起来。
示例:记录DDL操作
- 定义触发器函数:
CREATE TABLE ddl_log(command_text varchar(64), user_name varchar(32), command_time datetime);CREATE FUNCTION log_ddl_commands()RETURNS event_trigger LANGUAGE plpgsql AS $$
DECLAREobj record;
BEGIN-- Capturing Changes at Command End FOR obj IN SELECT * FROM pg_event_trigger_ddl_commands ()LOOPINSERT INTO ddl_log (command_text,user_name,command_time,obj_name,obj_id)values(tg_tag,current_user,now(),obj.schema_name,obj.object_identity);END LOOP;
END
$$;
在这个例子中,我们创建了一个名为log_ddl_commands
的函数,它会在DDL命令执行时插入一条记录到ddl_log
表中。这个表需要事先创建,并包含相应的列来存储命令文本、用户名和命令执行时间。
Capturing Changes at Command End
- pg_event_trigger_ddl_commands returns a list of DDL commands executed by each user action, when invoked in a function attached to a ddl_command_end event trigger. If called in any other context, an error is raised.
- pg_event_trigger_ddl_commands returns one row for each base command executed; some commands that are a single SQL sentence may return more than one row. This function returns the following columns:
- 创建事件触发器:
CREATE EVENT TRIGGER ddl_audit_trigger ON ddl_command_end EXECUTE FUNCTION log_ddl_commands();
在这个例子中,我们创建了一个名为ddl_audit_trigger
的事件触发器,它会在任何CREATE TABLE
、ALTER TABLE
命令执行结束时调用log_ddl_commands
函数。
-- 创建一个表,测试事件触发器是否正确执行
superdb=# create table t_event_trigger(id int);
CREATE TABLE
-- 查询DDL变更日志记录
superdb=# select * from ddl_log;command_text | user_name | command_time | obj_name | obj_id
--------------+-----------+----------------------------+----------+------------------------CREATE TABLE | super | 2024-12-13 19:55:33.232567 | public | public.t_event_trigger
(1 rows)
-- 给表增加字段,并查询DDL变更日志记录
superdb=# alter table t_event_trigger add column infoname varchar(32);
ALTER TABLE
superdb=# select * from ddl_log;command_text | user_name | command_time | obj_name | obj_id
--------------+-----------+----------------------------+----------+------------------------CREATE TABLE | super | 2024-12-13 19:55:33.232567 | public | public.t_event_triggerALTER TABLE | super | 2024-12-13 19:57:45.244284 | public | public.t_event_trigger
(3 rows)
-- 可以观察导,事件触发器是否正确执行,DDL变更日志已经成功插入导ddl_log
Processing Objects Dropped by a DDL Command
- pg_event_trigger_dropped_objects returns a list of all objects dropped by the command in whose sql_drop event it is called. If called in any other context, an error is raised. This function returns the following columns:
-- 创建函数用于记录DDL删除事件日志
CREATE FUNCTION log_ddl_commands_for_drops()RETURNS event_trigger LANGUAGE plpgsql AS $$
DECLAREobj record;
BEGINFOR obj IN SELECT * FROM pg_event_trigger_dropped_objects()LOOPINSERT INTO ddl_log (command_text,user_name,command_time,obj_name,obj_id)values(tg_tag,current_user,now(),obj.schema_name,obj.object_identity);END LOOP;
END;
$$;
-- 创建事件触发器
CREATE EVENT TRIGGER ddl_audit_trigger_for_drops ON sql_drop EXECUTE FUNCTION log_ddl_commands_for_drops();-- 删除表,测试事件触发器是否正确执行
superdb=# drop table t_event_trigger;
DROP TABLEsuperdb=# select * from ddl_log;command_text | user_name | command_time | obj_name | obj_id
-----------------+-----------+----------------------------+----------+-------------------------------------CREATE TABLE | super | 2024-12-13 19:55:33.232567 | public | public.t_event_triggerALTER TABLE | super | 2024-12-13 19:57:45.244284 | public | public.t_event_triggerCREATE FUNCTION | super | 2024-12-13 20:11:23.028464 | public | public.log_ddl_commands_for_drops()DROP TABLE | super | 2024-12-13 20:12:33.692562 | public | public.t_event_triggerDROP TABLE | super | 2024-12-13 20:12:33.692562 | public | public.t_event_triggerDROP TABLE | super | 2024-12-13 20:12:33.692562 | public | public.t_event_trigger[]
(7 rows)
事件触发器的限制
- 事件触发器不能回滚它们所执行的操作,如果触发器函数中的操作失败,它不会阻止已经发生的DDL命令。
- 由于事件触发器作用于整个数据库实例,因此它们可能会对性能产生影响,特别是在处理大量并发DDL操作时。
总结
事件触发器是PostgreSQL中强大的工具,允许数据库管理员在数据库级别实施全局策略和执行自动化任务。通过合理使用事件触发器,可以有效地提高数据库的安全性、可维护性和可操作性。
相关文章:

PostgreSQL中事件触发器Event Trigger
在PostgreSQL中,事件触发器(Event Trigger)是一种特殊的触发器类型,它允许你在特定的数据库系统事件发生时执行特定的操作。与普通的触发器不同,事件触发器并不与特定的表或视图相关联,而是与数据库级别的全…...
uni.request流式(Stream)请求,实现打印机效果
最近使用扣子 - 开发指南 (coze.cn)和智谱AI开放平台开发小程序AI导诊和用药对话指南。 开发的过程中也是走了不少坑,下面就来聊聊走了哪些坑。 坑1 :coze试了v2和v3的接口,两个接口请求还是有点差别的,v2拿到了botId和accessToken可以直接请求不需要做任何处理,v3还需要…...
canvas保存图片
需求:上面有几个按钮,其中有一个切换是图片 用v-if会导致图片加载慢 实现方法: 一进来就加载,通过监听元素显示,用于控制canvas的宽高,从而达到隐藏的效果 组件dowolad.vue <template><view …...
DNS到底有什么用?
举个例子,对于我们来说访问的域名是www.baidu.com,但是实际在计算机并不认识这个域名,计算机是需要通过IP地址去访问这个网站,所以呢?这个时候就需要一个dns解析器,来把这串域名转换为IP地址给计算机去访问…...

什么是CRM系统?CRM系统的功能、操作流程、生命周期
CRM系统作为企业管理和维护客户关系的重要工具,在商业活动中扮演着越来越重要的角色。今天,就让我们一起揭开它的神秘面纱,看看这个“幕后英雄”到底是怎么工作的。 什么是CRM系统? 首先,我们要了解什么是CRM。简单来…...

美畅物联丨JS播放器录像功能:从技术到应用的全面解析
畅联云平台的JS播放器是一款功能十分强大的视频汇聚平台播放工具,它已经具备众多实用功能,像实时播放、历史录像回放、云台控制、倍速播放、录像记录、音频播放、画面放大、全屏展示、截图捕捉等等。这些功能构建起了一个高效、灵活且用户友好的播放环境…...

我们来学mysql -- 事务并发之不可重复读(原理篇)
事务并发之不可重复读 题记不可重复读系列文章 题记 在《事务之概念》提到事务对应现实世界的状态转换,这个过程要满足4个特性这世界,真理只在大炮射程之类,通往和平的道路,非“常人”可以驾驭一个人生活按部就班,人多…...

ABAQUS进行焊接仿真分析(含子程序)
0 前言 焊接技术作为现代制造业中的重要连接工艺,广泛应用于汽车、船舶、航空航天、能源等多个行业。焊接接头的质量和性能直接影响到结构件的安全性、可靠性和使用寿命。因此,在焊接过程中如何有效预测和优化焊接过程中的热效应、应力变化以及材料变形等问题,成为了焊接研…...
BAPI_GOODSMVT_CREATE物料凭证增强字段
目的:增加字段LSMNG LSMEH的赋值 项目MSEG 的 BAPI 表增强结构 BAPI_TE_XMSEG 抬头MKPF 的 BAIP 表增强 BAPI_TE_XMKPF 1. 在结构BAPI_TE_XMSEG中appending structure附加结构 ZMSEG_001,增加字段LSMNG, LSMEH In The method IF_EX_MB_H…...

tomcat的优化和动静分离
tomcat的优化 1.tomcat的配置优化 2.操作系统的内核优化 注意:设置保存后,需要重新ssh连接才会看到配置更改的变化 vim /etc/security/limits.conf # 65535 为Linux系统最大打开文件数 * soft nproc 65535 * hard nproc 65535 * soft nofile 65535 *…...
[ShaderLab] 【Unity】【图像编程】理解 Unity Shader 的结构
在计算机图形学领域,开发者经常面临着管理着色器复杂性的挑战。正如大卫惠勒(David Wheeler)所说:“计算机科学中的任何问题都可以通过增加一层抽象来解决。” Unity 提供了这样一层抽象,即 ShaderLab,它通过组织和定义渲染过程的各个步骤,简化了编写着色器的过程。 什…...
vue的前端架构 介绍各自的优缺点
Vue.js 是一个用于构建用户界面的渐进式框架,可以根据项目的复杂性和需求选择不同的前端架构。以下是几种常见的 Vue 前端架构及其优缺点: 1. 单页应用 (SPA) 单页应用(Single Page Application,简称 SPA)是一种现代…...
可信AI与零知识证明的概念
可信AI 可信AI是指人工智能的设计、开发和部署遵循一系列原则和方法,以确保其行为和决策是可靠、可解释、公平、安全且符合人类价值观和社会利益的.以下是关于可信AI的举例说明、实现方式及主流方案: 举例说明 医疗诊断领域:一个可信AI的医疗诊断系统,不仅能够准确地识别…...
JavaScript逆向时,常用的11个hook
提示:记录工作中遇到的需求及解决办法 文章目录 前言01、dom操作02、Cookie操作03、事件监听操作04、AJAX拦截操作05、函数替换操作06、Header操作07、URL操作08、JSON.stringify操作09、JSON.parse操作10、eval操作11、Function操作前言 在逆向分析JavaScript代码时,开发者…...

PCL点云库入门——PCL库可视化之CloudViewer类简单点云信息显示
1、前言 可视化(visualization)涉及运用计算机图形学和图像处理技术,将数据转换成图像并在屏幕上展示,同时支持交互式处理。在PCL库中,一系列强大的可视化工具可供使用,其中较为流行的包括CloudViewer和PCL…...
C++ 【衔接篇】
大名鼎鼎的c实际上是由c语言扩展而来的,它最初是由本贾尼在20世纪80年代开发。目的是支持面向对象编程,同时保持c语言高效和可移植等优点。c是c的扩展,在一定程度上解决了c语言在特殊场景下的使用局限。 1、命名空间 在详细说明命名空间之前…...
qcreator 调试原理
在 Qt 开发中,Qt Creator 是一个集成开发环境(IDE),用于开发 Qt 应用程序。Qt Creator 提供了强大的调试功能,可以帮助开发者高效地调试 C、QML 等语言的应用程序。Qt Creator 支持多种调试工具,包括基于 G…...

Windows 系统中的组策略编辑器如何打开?
组策略是 Windows 操作系统中用于设置计算机和用户配置的重要工具。它允许管理员控制各种系统功能,从桌面背景到安全设置等。对于 Windows 专业版、企业版和教育版用户来说,可以通过组策略编辑器(Group Policy Editor)来管理这些设…...
scala的泛型类
泛型:类型参数化 泛型类指的是把泛型定义到类的声明上, 即:该类中的成员的参数类型是由泛型来决定的. 在创建对象时, 明确具体的数据类型. 定义格式: class 类名(成员名:数据类型) class 类名[泛型名](成员名:泛型名) 参考代…...
基于Couchbase的数据构建方案:数仓分层
初步方案是将公共层和报表层分别放在不同的bucket中,这种设计从存储和访问优化的角度是合理的,但仍有以下细节需要考虑: 1. 数仓公共层设计(origin bucket) 合理性分析: 将ODS、DWD、DWS层的数据放在一个b…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...

【堆垛策略】设计方法
堆垛策略的设计是积木堆叠系统的核心,直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法,涵盖基础规则、优化算法和容错机制: 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则: 大尺寸/重量积木在下…...