当前位置: 首页 > news >正文

PostgreSQL中事件触发器Event Trigger

在PostgreSQL中,事件触发器(Event Trigger)是一种特殊的触发器类型,它允许你在特定的数据库系统事件发生时执行特定的操作。与普通的触发器不同,事件触发器并不与特定的表或视图相关联,而是与数据库级别的全局事件相关联。

参考官方文档如下
https://www.postgresql.org/docs/16/functions-event-triggers.html

事件触发器的特点

  1. 全局作用:事件触发器作用于整个数据库实例,而不是单个表或视图。
  2. 系统事件:它们响应的是数据库系统级的事件,如DDL(数据定义语言)命令的执行、配置参数的更改、日志文件的切换等。
  3. 灵活性:可以定义复杂的响应逻辑,通过PL/pgSQL、PL/Tcl、PL/Perl等过程语言来实现。

事件触发器的使用场景

  • 审计和日志记录:记录所有DDL操作的日志,以便进行审计或回滚。
  • 安全策略实施:防止未经授权的DDL更改,或确保在更改前满足某些条件。
  • 自动化任务:在数据库达到特定条件时自动执行维护任务,如清理日志、备份等。

事件触发器的创建

创建事件触发器需要两个步骤:

  1. 定义触发器函数:这个函数将包含事件发生时需要执行的逻辑。
  2. 创建事件触发器:将这个触发器函数与一个或多个特定的事件关联起来。
示例:记录DDL操作
  1. 定义触发器函数
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:
    在这里插入图片描述
  1. 创建事件触发器
CREATE EVENT TRIGGER ddl_audit_trigger ON ddl_command_end EXECUTE FUNCTION log_ddl_commands();

在这个例子中,我们创建了一个名为ddl_audit_trigger的事件触发器,它会在任何CREATE TABLEALTER 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保存图片

需求&#xff1a;上面有几个按钮&#xff0c;其中有一个切换是图片 用v-if会导致图片加载慢 实现方法&#xff1a; 一进来就加载&#xff0c;通过监听元素显示&#xff0c;用于控制canvas的宽高&#xff0c;从而达到隐藏的效果 组件dowolad.vue <template><view …...

DNS到底有什么用?

举个例子&#xff0c;对于我们来说访问的域名是www.baidu.com&#xff0c;但是实际在计算机并不认识这个域名&#xff0c;计算机是需要通过IP地址去访问这个网站&#xff0c;所以呢&#xff1f;这个时候就需要一个dns解析器&#xff0c;来把这串域名转换为IP地址给计算机去访问…...

什么是CRM系统?CRM系统的功能、操作流程、生命周期

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

美畅物联丨JS播放器录像功能:从技术到应用的全面解析

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

我们来学mysql -- 事务并发之不可重复读(原理篇)

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

ABAQUS进行焊接仿真分析(含子程序)

0 前言 焊接技术作为现代制造业中的重要连接工艺,广泛应用于汽车、船舶、航空航天、能源等多个行业。焊接接头的质量和性能直接影响到结构件的安全性、可靠性和使用寿命。因此,在焊接过程中如何有效预测和优化焊接过程中的热效应、应力变化以及材料变形等问题,成为了焊接研…...

BAPI_GOODSMVT_CREATE物料凭证增强字段

目的&#xff1a;增加字段LSMNG LSMEH的赋值 项目MSEG 的 BAPI 表增强结构 BAPI_TE_XMSEG 抬头MKPF 的 BAIP 表增强 BAPI_TE_XMKPF 1. 在结构BAPI_TE_XMSEG中appending structure附加结构 ZMSEG_001&#xff0c;增加字段LSMNG&#xff0c; LSMEH In The method IF_EX_MB_H…...

tomcat的优化和动静分离

tomcat的优化 1.tomcat的配置优化 2.操作系统的内核优化 注意&#xff1a;设置保存后&#xff0c;需要重新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 是一个用于构建用户界面的渐进式框架&#xff0c;可以根据项目的复杂性和需求选择不同的前端架构。以下是几种常见的 Vue 前端架构及其优缺点&#xff1a; 1. 单页应用 (SPA) 单页应用&#xff08;Single Page Application&#xff0c;简称 SPA&#xff09;是一种现代…...

可信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、前言 可视化&#xff08;visualization&#xff09;涉及运用计算机图形学和图像处理技术&#xff0c;将数据转换成图像并在屏幕上展示&#xff0c;同时支持交互式处理。在PCL库中&#xff0c;一系列强大的可视化工具可供使用&#xff0c;其中较为流行的包括CloudViewer和PCL…...

C++ 【衔接篇】

大名鼎鼎的c实际上是由c语言扩展而来的&#xff0c;它最初是由本贾尼在20世纪80年代开发。目的是支持面向对象编程&#xff0c;同时保持c语言高效和可移植等优点。c是c的扩展&#xff0c;在一定程度上解决了c语言在特殊场景下的使用局限。 1、命名空间 在详细说明命名空间之前…...

qcreator 调试原理

在 Qt 开发中&#xff0c;Qt Creator 是一个集成开发环境&#xff08;IDE&#xff09;&#xff0c;用于开发 Qt 应用程序。Qt Creator 提供了强大的调试功能&#xff0c;可以帮助开发者高效地调试 C、QML 等语言的应用程序。Qt Creator 支持多种调试工具&#xff0c;包括基于 G…...

Windows 系统中的组策略编辑器如何打开?

组策略是 Windows 操作系统中用于设置计算机和用户配置的重要工具。它允许管理员控制各种系统功能&#xff0c;从桌面背景到安全设置等。对于 Windows 专业版、企业版和教育版用户来说&#xff0c;可以通过组策略编辑器&#xff08;Group Policy Editor&#xff09;来管理这些设…...

scala的泛型类

泛型&#xff1a;类型参数化 泛型类指的是把泛型定义到类的声明上, 即:该类中的成员的参数类型是由泛型来决定的. 在创建对象时, 明确具体的数据类型. 定义格式: class 类名&#xff08;成员名&#xff1a;数据类型&#xff09; class 类名[泛型名](成员名:泛型名) 参考代…...

基于Couchbase的数据构建方案:数仓分层

初步方案是将公共层和报表层分别放在不同的bucket中&#xff0c;这种设计从存储和访问优化的角度是合理的&#xff0c;但仍有以下细节需要考虑&#xff1a; 1. 数仓公共层设计&#xff08;origin bucket&#xff09; 合理性分析&#xff1a; 将ODS、DWD、DWS层的数据放在一个b…...

Twitter运营完整流程:从0到引流获客全流程拆解(2026)

在当前海外营销环境中&#xff0c;Twitter&#xff08;X&#xff09;已经成为获取流量和客户的重要渠道之一。但很多人在实际操作中都会遇到问题&#xff1a;不知道从哪里开始做了很久没有效果有流量但没有转化不清楚完整流程那么&#xff0c;Twitter运营到底该怎么做&#xff…...

SPI协议实战指南:从基础配置到多设备高效通信

1. SPI协议基础&#xff1a;从零开始理解通信机制 第一次接触SPI协议时&#xff0c;我被它那看似简单的四线制结构迷惑了——明明只有四条线&#xff0c;为什么能实现高速全双工通信&#xff1f;后来在调试智能家居主控板时才发现&#xff0c;正是这种精简设计让SPI成为嵌入式领…...

DMA技术解析:提升嵌入式系统性能的关键

1. DMA技术概述&#xff1a;解放CPU的搬运工 DMA&#xff08;Direct Memory Access&#xff09;直接存储器访问技术&#xff0c;是现代嵌入式系统中提升性能的关键设计。我第一次在STM32项目中使用DMA传输时&#xff0c;实测发现ADC采样率从500kHz提升到2.1MHz&#xff0c;CPU占…...

EnOcean BLE设备轻量级解析库设计与实现

1. 项目概述EnOceanBleDevices 是一个面向嵌入式平台的轻量级 BLE 协议栈扩展库&#xff0c;专为集成 EnOcean 自供电 BLE 设备而设计。其核心目标并非替代标准 BLE 协议栈&#xff08;如 ESP-IDF 的 NimBLE 或 Bluedroid&#xff09;&#xff0c;而是构建在底层 BLE 扫描能力之…...

TVS二极管

TVS引起的两起事故案例1&#xff1a;整机在打ESD静电的时候&#xff0c;出现通信异常。通过排查&#xff0c;最后定位在如下图左边的通信接口处&#xff0c;右边是咱们的主芯片。之所以产品会被打挂&#xff0c;主要原因是TVS布局未靠近接口处放置&#xff0c;TVS放置位置距离接…...

嵌入式系统软件抗干扰技术实战解析

1. 嵌入式系统抗干扰技术概述在工业控制、智能家居和物联网设备等嵌入式应用场景中&#xff0c;电磁干扰、电源波动等环境因素常常导致系统运行异常。作为一名有十年嵌入式开发经验的工程师&#xff0c;我处理过数十起由干扰引起的系统故障案例。硬件抗干扰措施如屏蔽、滤波固然…...

实时行情系统设计:从协议选择到高可用架构,再到数据源选型馗

一、核心问题及解决方案&#xff08;按踩坑频率排序&#xff09; 问题 1&#xff1a;误删他人持有锁——最基础也最易犯的漏洞 成因&#xff1a;释放锁时未做身份校验&#xff0c;直接执行 DEL 命令删除键。典型场景&#xff1a;服务 A 持有锁后&#xff0c;业务逻辑耗时超过锁…...

Python图书借阅管理系统实战

# 题目描述# 设计一个简单的图书借阅管理系统。系统初始包含若干本图书&#xff0c;每本图书的信息包括&#xff1a;# 书号&#xff08;字符串&#xff09;# 书名&#xff08;字符串&#xff09;# 作者&#xff08;字符串&#xff09;# 库存数量&#xff08;整数&#xff09;# …...

运维进阶!Zabbix 高可用集群部署实战指南,从零搭建企业级监控系统

1. 为什么需要Zabbix高可用集群&#xff1f; 在企业生产环境中&#xff0c;监控系统的稳定性直接关系到整个IT基础设施的可观测性。想象一下&#xff0c;当你的监控系统突然宕机&#xff0c;所有服务器、网络设备、应用程序的运行状态瞬间"失明"&#xff0c;这种场景…...

FasterRCNN训练完别急着关!用predict.py批量预测并保存结果的完整配置指南

FasterRCNN模型预测实战&#xff1a;从批量推理到结果保存的全流程解析 当你终于完成FasterRCNN模型漫长的训练过程&#xff0c;看着损失曲线平稳下降&#xff0c;验证集指标达到预期&#xff0c;那种成就感不言而喻。但很多开发者在这里犯了一个常见错误——直接关闭项目转向下…...