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ÿ…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...




