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

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框架整合 第一步&#xff1a;指定打包方式和导入所需要的依赖 打包方法&#xff1a;war springMVC所需依赖 解析json依赖 mybatis依赖 数据库驱动依赖 druid数据源依赖 junit依赖 第二步&#xff1a;导入tomcat插件 第三步&#xff1a;编写配置类 SpringCon…...

古籍双层PDF制作教程:保姆级古籍数字化教程

在智慧古籍数字化项目中&#xff0c;很多图书馆要求将古籍导出为双层PDF&#xff0c;并且确保输出双层PDF底层文本与上层图片偏移量控制在1毫米以内。那么本教程带你使用古籍数字化平台&#xff0c;3分钟把一个古籍书籍转化为双侧PDF。 第1步&#xff1a;上传古籍 点批量上传…...

Git 删除 远端的分支

要删除 Git 远端的分支&#xff08;例如&#xff1a; V3.2.1.13&#xff09;&#xff1a; 可以执行以下命令 git push origin --delete V3.2.1.13这条命令会向远端的仓库删除名为 V3.2.1.13 的分支。如果这个分支只在远端仓库存在而没有对应的本地分支&#xff0c;那么删除后这…...

PrgogressBar实现原理分析

ProgressBar 是 Android 中用于显示进度条的控件&#xff0c;它可以用来表示任务的完成程度或者加载进度等信息。ProgressBar 有两种主要类型&#xff1a;一种是确定性的&#xff08;determinate&#xff09;&#xff0c;另一种是不确定性的&#xff08;indeterminate&#xff…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...