openGauss触发器详解
openGauss 是一款开源关系型数据库管理系统,广泛应用于企业级应用中。随着数据量的增长和业务逻辑的复杂化,数据库管理和操作的自动化需求越来越高。触发器(Triggers)作为数据库中重要的编程工具,能够极大地简化复杂操作,提高系统的性能和安全性。openGauss触发器会在指定的数据库事件发生时自动执行函数。本文将详细介绍 openGauss 的触发器,并提供具体的代码和案例,以帮助读者更好地理解和应用这些工具。
目录
一、什么是触发器
二、创建和使用触发器
1. 创建日志表
2. 创建触发器函数和触发器
3. 创建删除触发器函数
4. 创建触发器
5.修改触发器
三、验证触发器
1. 插入员工数据以触发触发器
2. 更新员工数据以触发触发器
3. 删除员工数据以触发触发器
4. 查询日志表
四、 触发器的高级应用
1. 数据完整性维护
2. 审计和日志记录
3. 自动计算和更新
五、参数说明
六、总结
一、什么是触发器
触发器是一种特殊类型的存储过程,它会在特定事件(如插入、更新、删除)发生时自动执行。触发器能够自动响应数据库表中的变化,进行数据验证、日志记录等操作。使用触发器可以确保数据的完整性、一致性,并实现复杂的业务逻辑。
触发器的特点包括:
- 自动执行:触发器在指定事件发生时自动执行,无需显式调用。
- 灵活性:可以根据具体业务需求,灵活定义触发器的执行逻辑。
- 实时性:触发器在事件发生时立即执行,保证数据的实时性。
二、创建和使用触发器
在 openGauss 中,创建触发器需要使用 CREATE TRIGGER 语句。触发器通常需要配合触发器函数(存储过程)一起使用。下面是多个触发器的例子,演示如何创建和使用触发器。
1. 创建日志表
-- 创建日志表
CREATE TABLE employee_changes (change_id SERIAL PRIMARY KEY,emp_id INT,change_type VARCHAR(10),change_time TIMESTAMP,old_name VARCHAR(100),new_name VARCHAR(100),old_salary NUMERIC(15, 2),new_salary NUMERIC(15, 2),old_department VARCHAR(100),new_department VARCHAR(100));
2. 创建触发器函数和触发器
-- 创建插入触发器函数
-- 创建插入触发器函数
CREATE OR REPLACE FUNCTION log_insert_employee()RETURNS TRIGGERLANGUAGE plpgsqlAS $$BEGININSERT INTO employee_changes (emp_id, change_type, change_time, new_name, new_salary, new_department)VALUES (NEW.id, 'INSERT', CURRENT_TIMESTAMP, NEW.name, NEW.salary, NEW.department);RETURN NEW;END;$$;

-- 创建更新触发器函数CREATE OR REPLACE FUNCTION log_update_employee()RETURNS TRIGGERLANGUAGE plpgsqlAS $$BEGININSERT INTO employee_changes (emp_id, change_type, change_time, old_name, new_name, old_salary, new_salary, old_department, new_department)VALUES (OLD.id, 'UPDATE', CURRENT_TIMESTAMP, OLD.name, NEW.name, OLD.salary, NEW.salary, OLD.department, NEW.department);RETURN NEW;END;$$;

3. 创建删除触发器函数
-- 创建删除触发器函数CREATE OR REPLACE FUNCTION log_delete_employee()RETURNS TRIGGERLANGUAGE plpgsqlAS $$BEGININSERT INTO employee_changes (emp_id, change_type, change_time, old_name, old_salary, old_department)VALUES (OLD.id, 'DELETE', CURRENT_TIMESTAMP, OLD.name, OLD.salary, OLD.department);RETURN OLD;END;$$;
DROP TRIGGER trigger_name ON table_name [ CASCADE | RESTRICT ];
4. 创建触发器
-- 创建触发器
CREATE TRIGGER trigger_insert_employeeAFTER INSERT ON employeesFOR EACH ROWEXECUTE FUNCTION log_insert_employee();

CREATE TRIGGER trigger_update_employeeAFTER UPDATE ON employeesFOR EACH ROWEXECUTE FUNCTION log_update_employee();

CREATE TRIGGER trigger_delete_employeeAFTER DELETE ON employeesFOR EACH ROWEXECUTE FUNCTION log_delete_employee();

CREATE TRIGGER trigger_name { BEFORE | AFTER | INSTEAD OF } { event [ OR ... ] }ON table_name[ FOR [ EACH ] { ROW | STATEMENT } ][ WHEN ( condition ) ]EXECUTE PROCEDURE function_name ( arguments );
5.修改触发器
ALTER TRIGGER trigger_name ON table_name RENAME TO new_trigger_name;
三、验证触发器
通过插入、更新和删除操作来验证触发器的功能,确保日志表记录了相应的变更。
1. 插入员工数据以触发触发器
INSERT INTO employees (id, name, salary, department)VALUES (1, 'John Doe', 50000, 'Engineering');

2. 更新员工数据以触发触发器
UPDATE employeesSET name = 'John Doe', salary = 55000, department = 'Marketing'WHERE id = 1;

3. 删除员工数据以触发触发器
DELETE FROM employeesWHERE id = 1;

4. 查询日志表
SELECT * FROM employee_changes;
四、 触发器的高级应用
触发器不仅可以用于基本的数据变更日志记录,还可以用于更复杂的业务逻辑处理。以下是一些触发器的高级应用场景:
1. 数据完整性维护
触发器可以在数据插入、更新或删除时自动检查和维护数据的完整性。例如,可以在员工表中添加触发器,确保同一部门中的员工薪资总和不超过某个限制。
-- 创建触发器函数
CREATE OR REPLACE FUNCTION check_salary_limit()RETURNS TRIGGERLANGUAGE plpgsqlAS $$DECLAREtotal_salary NUMERIC;BEGINSELECT SUM(salary) INTO total_salaryFROM employeesWHERE department = NEW.department;IF total_salary + NEW.salary > 1000000 THENRAISE EXCEPTION 'Total salary in department % exceeds limit', NEW.department;END IF;RETURN NEW;END;$$;

-- 创建触发器
CREATE TRIGGER trigger_check_salary_limitBEFORE INSERT OR UPDATE ON employeesFOR EACH ROWEXECUTE FUNCTION check_salary_limit();
2. 审计和日志记录
触发器可以记录数据的变化历史,便于追踪和审计。例如,可以在员工表中添加触发器,记录每次更新操作的详细信息,包括操作人、操作时间和更新前后的数据。
-- 创建审计日志表
CREATE TABLE audit_log (log_id SERIAL PRIMARY KEY,emp_id INT,operation VARCHAR(10),operation_time TIMESTAMP,operator VARCHAR(100),old_data JSON,new_data JSON);
-- 创建触发器函数
CREATE OR REPLACE FUNCTION log_audit()RETURNS TRIGGERLANGUAGE plpgsqlAS $$BEGININSERT INTO audit_log (emp_id, operation, operation_time, operator, old_data, new_data)VALUES (NEW.id,TG_OP,CURRENT_TIMESTAMP,current_user,ROW_TO_JSON(OLD),ROW_TO_JSON(NEW));RETURN NEW;END;$$;

-- 创建触发器
CREATE TRIGGER trigger_audit_logAFTER INSERT OR UPDATE OR DELETE ON employeesFOR EACH ROWEXECUTE FUNCTION log_audit();
3. 自动计算和更新
触发器可以在数据发生变化时自动计算和更新相关联的数据,保持数据的一致性。例如,可以在订单表中添加触发器,当订单状态变为“已发货”时,自动更新库存表。
-- 创建订单表
CREATE TABLE orders (order_id INT PRIMARY KEY,product_id INT,quantity INT,status VARCHAR(20));
-- 创建库存表
CREATE TABLE inventory (product_id INT PRIMARY KEY,stock INT);
-- 创建触发器函数
CREATE OR REPLACE FUNCTION update_inventory()RETURNS TRIGGERLANGUAGE plpgsqlAS $$BEGINIF NEW.status = 'Shipped' THENUPDATE inventorySET stock = stock - NEW.quantityWHERE product_id = NEW.product_id;END IF;RETURN NEW;END;$$;
-- 创建触发器
CREATE TRIGGER trigger_update_inventoryAFTER UPDATE ON ordersFOR EACH ROWWHEN (NEW.status = 'Shipped')EXECUTE FUNCTION update_inventory();

五、参数说明
-
trigger_name
触发器名称。
-
BEFORE
触发器函数是在触发事件发生前执行。
-
AFTER
触发器函数是在触发事件发生后执行。
-
INSTEAD OF
触发器函数直接替代触发事件。
-
event
启动触发器的事件,取值范围包括:INSERT、UPDATE、DELETE或TRUNCATE,也可以通过OR同时指定多个触发事件。
-
table_name
触发器对应的表名称。
-
FOR EACH ROW | FOR EACH STATEMENT
触发器的触发频率。
- FOR EACH ROW是指该触发器是受触发事件影响的每一行触发一次。
- FOR EACH STATEMENT是指该触发器是每个SQL语句只触发一次。
未指定时默认值为FOR EACH STATEMENT。约束触发器只能指定为FOR EACH ROW。
-
function_name
用户定义的函数,必须声明为不带参数并返回类型为触发器,在触发器触发时执行。
-
arguments
执行触发器时要提供给函数的可选的以逗号分隔的参数列表。
-
new_trigger_name
修改后的新触发器名称。
六、总结
触发器是 openGauss 数据库中的重要工具,能够帮助开发者简化复杂的数据库操作,实现自动化管理。在实际应用中,通过合理地使用触发器,可以提高数据库系统的效率和可靠性。本文详细介绍了触发器的基本概念、创建方法、应用场景,并提供了具体的代码和案例,帮助读者更好地理解和应用这些工具。希望本文能够对您在数据库开发和管理中有所帮助。
相关文章:
openGauss触发器详解
openGauss 是一款开源关系型数据库管理系统,广泛应用于企业级应用中。随着数据量的增长和业务逻辑的复杂化,数据库管理和操作的自动化需求越来越高。触发器(Triggers)作为数据库中重要的编程工具,能够极大地简化复杂操…...
抄作业-跟着《React通关秘籍》捣鼓React-playground-上集
文章目录 前言1. 搭建react 开发环境2、react hooks 知识3. 目标:跟着小册实现 react-playground3.1 整体布局初始化项目使用Alloment 来实现左右分屏的拖拉功能 3.2 代码编辑器Monaco Editor 3.3 实现了多文件的切换用 useContext 来共享数据。优化 tab的样式&…...
80后最后的书信 年代
当时11亿人口只有1.8万部固定电话 中国几千年来 鱼传尺素 雁寄鸿书 写信最后要写 亲啓 如有照片,封面要写内有照片,请勿折叠 信的开头应该是 见字如面,展信舒颜 如果拜托别人做事情,最后要写为盼 最后要写 某某草 书未尽…...
软考-软件设计师(4)-计算机网络与安全:OSI七层、子网划分、网络安全控制技术、网络安全协议、网络安全威胁、对称与非对称加密等高频考点
场景 软考-软件设计师-计算机网络与信息安全模块高频考点整理。 以下为高频考点、知识点汇总,不代表该模块所有知识点覆盖,请以官方教程提纲为准。 注: 博客:霸道流氓气质-CSDN博客 实现 知识点 OSI/RM七层模型 注意各层的主要功能,特别是表示层负责数据的加密、压…...
Unity横板动作游戏 -为什么我又开始学习Unity,而不是Godot。
Readme 最近开始学习Unity制作2D动作游戏,由于一些操作第一次接触,为了加深印象,准备写这样一篇同步教程的笔记。 之前也接触过Unity,用 Unity 制作过一个非常简单的小游戏 Flappy Bird,并且魔改成了泰拉瑞亚的版本。…...
什么是NIO
NIO(New Input/Output),也称为Java非阻塞IO,是从Java 1.4版本开始引入的一个新的IO API,旨在提供一种比传统的阻塞IO更高效、更灵活的IO操作方式。 一 NIO用法的详细介绍 NIO支持面向缓冲区的、基于通道的IO操作&…...
PHP switch 替代品 match
match 是 PHP 8 中引入的新特性。在 PHP 8 中,match 用作新的类型安全的替代 switch 语句。它提供了更清晰、更简洁的语法,同时还支持表达式作为条件,可以更轻松地处理复杂的条件逻辑。 在 match 表达式中,每个分支都是一个条件和…...
FastAPI(七十四)实战开发《在线课程学习系统》接口开发-- 删除留言
源码见:"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 之前文章FastAPI(七十三)实战开发《在线课程学习系统》接口开发-- 回复留言,那么我们这次分享删除留言接口的开发…...
面试重点---快速排序
快排单趟 快速排序是我们面试中的重点,这个知识点也很抽象,需要我们很好的掌握,而且快速排序的代码也是非常重要,需要我们懂了还不行,必须要手撕代码,学的透彻。 在研究快速排序之前,我们首先…...
[MIT6.5840]MapReduce
MapReduce Lab 地址 https://pdos.csail.mit.edu/6.824/labs/lab-mr.html 论文地址 https://static.googleusercontent.com/media/research.google.com/zh-CN//archive/mapreduce-osdi04.pdf 工作原理 简单来讲,MapReduce是一种分布式框架,可以用来处理…...
【系统架构设计师】计算机组成与体系结构 ⑯ ( 奇偶校验码 | CRC 循环冗余码 | 海明码 | 模 2 除法 )
文章目录 一、校验码1、校验码由来2、奇偶校验码3、CRC 循环冗余码 ( 重点考点 )4、海明码校验 ( 软考不经常考到 ) 二、CRC 循环冗余码 ( 重点考点 )1、模 2 除法概念2、模 2 除法步骤3、模 2 除法示例4、CRC 循环冗余码示例 15、CRC 循环冗余码示例 2 参考之前的博客 : 【计…...
springboot,service 层统一异常抛出时,throws Exception写在接口上还是实现类上
springboot,service 层统一异常抛出时,throws Exception写在实现接口上,不是直接写在实现类上...
深度学习高效性网络
为了减轻Transformer笨重的计算成本,一系列工作重点开发了高效的Vision Transformer,如Swin Transformer、PVT、Twins、CoAtNet和MobileViT。 1、字节TRT-ViT 兼具CNN的速度、Transformer精度的模型 TRT-ViT(Transformer-based Vision Tra…...
PyQt ERROR:ModuleNotFoundError: No module named ‘matplotlib‘
Solution:打开cmd输入指令下载malplotlib pip install matplotlib...
Flutter Geolocator插件使用指南:获取和监听地理位置
Flutter Geolocator插件使用指南:获取和监听地理位置 简介 geolocator 是一个Flutter插件,提供了一个简单易用的API来访问特定平台的地理位置服务。它支持获取设备的最后已知位置、当前位置、连续位置更新、检查设备上是否启用了位置服务,以…...
网站基本布局CSS
代码 <!DOCTYPE html> <html> <head><meta charset"utf-8"><meta name"viewport" content"widthdevice-width, initial-scale1"><title></title><style type"text/css">body {margi…...
ssm框架整合,异常处理器和拦截器(纯注解开发)
目录 ssm框架整合 第一步:指定打包方式和导入所需要的依赖 打包方法:war springMVC所需依赖 解析json依赖 mybatis依赖 数据库驱动依赖 druid数据源依赖 junit依赖 第二步:导入tomcat插件 第三步:编写配置类 SpringCon…...
古籍双层PDF制作教程:保姆级古籍数字化教程
在智慧古籍数字化项目中,很多图书馆要求将古籍导出为双层PDF,并且确保输出双层PDF底层文本与上层图片偏移量控制在1毫米以内。那么本教程带你使用古籍数字化平台,3分钟把一个古籍书籍转化为双侧PDF。 第1步:上传古籍 点批量上传…...
Git 删除 远端的分支
要删除 Git 远端的分支(例如: V3.2.1.13): 可以执行以下命令 git push origin --delete V3.2.1.13这条命令会向远端的仓库删除名为 V3.2.1.13 的分支。如果这个分支只在远端仓库存在而没有对应的本地分支,那么删除后这…...
PrgogressBar实现原理分析
ProgressBar 是 Android 中用于显示进度条的控件,它可以用来表示任务的完成程度或者加载进度等信息。ProgressBar 有两种主要类型:一种是确定性的(determinate),另一种是不确定性的(indeterminateÿ…...
【YOLO目标检测全栈实战】39 多模型流水线:当YOLO遇上OCR和语音合成,如何让四个模型“共线生产”?
DIA DALI,我们把187ms的串行方案优化到15ms,性能提升12倍。但说实话,那只是两个模型之间的“小打小闹”。 今天我们要面对的,是一个真正的“四国联军”——YOLOv8检测、ResNet分类、OCR文字识别、语音合成,四个模型串联成一条生产线。 你可能会想:“不就是把四个模型串…...
4.4 Spark SQL数据源 - JSON
Spark SQL JSON数据源实战涵盖:自动Schema推断读取JSON文件、spark.read.json()方法应用、文件格式规范(每行独立JSON)、HDFS文件操作及Spark Shell交互式查询。核心实践包括:从HDFS读取用户与成绩JSON文件创建DataFrame并关联分析…...
Fansly下载器终极指南:3分钟学会离线保存你喜欢的创作者内容
Fansly下载器终极指南:3分钟学会离线保存你喜欢的创作者内容 【免费下载链接】fansly-downloader Easy to use fansly.com content downloading tool. Written in python, but ships as a standalone Executable App for Windows too. Enjoy your Fansly content of…...
在线水印怎么去除?2026年最新在线水印去除方法与工具推荐
图片、视频上的水印是版权保护的常见方式,但在内容创作、素材整理或个人使用时,有时需要移除这些标记。在线水印去除工具因为无需下载安装、跨平台兼容而成为不少人的选择。本文汇总了2026年实用的在线水印去除方法和工具推荐,帮你快速找到适…...
开源看板平台Open Kanban:从部署到生产环境全栈实践指南
1. 项目概述:一个开源的看板协作平台如果你正在寻找一个轻量级、可自部署、且能完全掌控数据的团队协作工具,那么clawnify/open-kanban这个项目值得你花时间深入了解。简单来说,它是一个开源的看板(Kanban)系统&#x…...
告别卡顿!在Windows上用VirtualBox+Ubuntu 20.04搭建涂鸦Wi-Fi SoC开发环境(保姆级避坑指南)
告别卡顿!在Windows上用VirtualBoxUbuntu 20.04搭建涂鸦Wi-Fi SoC开发环境(保姆级避坑指南) 嵌入式开发环境搭建往往是工程师面临的第一个挑战。当你在Windows系统上尝试运行Linux虚拟机进行涂鸦Wi-Fi SoC开发时,可能会遇到各种性…...
如何快速下载Fansly内容:完整Fansly Downloader使用指南
如何快速下载Fansly内容:完整Fansly Downloader使用指南 【免费下载链接】fansly-downloader Easy to use fansly.com content downloading tool. Written in python, but ships as a standalone Executable App for Windows too. Enjoy your Fansly content offlin…...
免费开源AMD Ryzen处理器调试工具:SMUDebugTool终极指南
免费开源AMD Ryzen处理器调试工具:SMUDebugTool终极指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://…...
制造业生产能耗智能管控,落地步骤与落地成本优化方案:基于AI Agent与TARS大模型的全链路实战指引
在2026年的工业数字化浪潮中,制造业正面临前所未有的能源双控压力。随着工信部办公厅发布《关于组织开展2026年度工业节能监察工作的通知》,针对新能源产业链及重点耗能环节的监管已进入“精细化、实时化、透明化”的新阶段。对于企业而言,能…...
企业内如何利用Taotoken实现APIKey的集中管理与审计追溯
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 企业内如何利用Taotoken实现APIKey的集中管理与审计追溯 对于需要将大模型能力集成到业务流程中的企业而言,管理多个开…...




