openGauss触发器详解

news2024/9/22 15:30:07

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 TRIGGER

LANGUAGE plpgsql

AS $$

BEGIN

    INSERT 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 TRIGGER

LANGUAGE plpgsql

AS $$

BEGIN

    INSERT 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 TRIGGER

LANGUAGE plpgsql

AS $$

BEGIN

    INSERT 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_employee

AFTER INSERT ON employees

FOR EACH ROW

EXECUTE FUNCTION log_insert_employee();

CREATE TRIGGER trigger_update_employee

AFTER UPDATE ON employees

FOR EACH ROW

EXECUTE FUNCTION log_update_employee();

CREATE TRIGGER trigger_delete_employee

AFTER DELETE ON employees

FOR EACH ROW

EXECUTE 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 employees

SET name = 'John Doe', salary = 55000, department = 'Marketing'

WHERE id = 1;

3. 删除员工数据以触发触发器

DELETE FROM employees

WHERE id = 1;

4. 查询日志表

SELECT * FROM employee_changes;

四、 触发器的高级应用

触发器不仅可以用于基本的数据变更日志记录,还可以用于更复杂的业务逻辑处理。以下是一些触发器的高级应用场景:

1. 数据完整性维护

触发器可以在数据插入、更新或删除时自动检查和维护数据的完整性。例如,可以在员工表中添加触发器,确保同一部门中的员工薪资总和不超过某个限制。

-- 创建触发器函数

CREATE OR REPLACE FUNCTION check_salary_limit()

RETURNS TRIGGER

LANGUAGE plpgsql

AS $$

DECLARE

    total_salary NUMERIC;

BEGIN

    SELECT SUM(salary) INTO total_salary

    FROM employees

    WHERE department = NEW.department;



    IF total_salary + NEW.salary > 1000000 THEN

        RAISE EXCEPTION 'Total salary in department % exceeds limit', NEW.department;

    END IF;



    RETURN NEW;

END;

$$;

-- 创建触发器

CREATE TRIGGER trigger_check_salary_limit

BEFORE INSERT OR UPDATE ON employees

FOR EACH ROW

EXECUTE 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 TRIGGER

LANGUAGE plpgsql

AS $$

BEGIN

    INSERT 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_log

AFTER INSERT OR UPDATE OR DELETE ON employees

FOR EACH ROW

EXECUTE 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 TRIGGER

LANGUAGE plpgsql

AS $$

BEGIN

    IF NEW.status = 'Shipped' THEN

        UPDATE inventory

        SET stock = stock - NEW.quantity

        WHERE product_id = NEW.product_id;

    END IF;



    RETURN NEW;

END;

$$;

-- 创建触发器

CREATE TRIGGER trigger_update_inventory

AFTER UPDATE ON orders

FOR EACH ROW

WHEN (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 数据库中的重要工具,能够帮助开发者简化复杂的数据库操作,实现自动化管理。在实际应用中,通过合理地使用触发器,可以提高数据库系统的效率和可靠性。本文详细介绍了触发器的基本概念、创建方法、应用场景,并提供了具体的代码和案例,帮助读者更好地理解和应用这些工具。希望本文能够对您在数据库开发和管理中有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1947854.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

广州机房服务器搬迁布线方案

友力科技(广州)有限公司,专业从事数据中心机房建设、改造和搬迁工程。友力科技(广州)有限公司提供的服务内容包括但不限于:原数据中心设备下架准备、沿途运输、新数据中心上架运行、数据迁移等。 友力科技…

前端面试细节重难点(十二)(已工作|做分享)

1、如何区分在react、vue和js中的是否传递e参数?事件对象e都要通过event作为实参显示传递形参才可接收到吗? 答:(1)在原生JavaScript中:事件对象e需要通过函数参数显式传递。 (2)在R…

观测云加入华为云「新加坡云联盟」,引领亚太创新潮流

7月19日,「新加坡云联盟」在华为云新加坡峰会2024上正式宣告成立。这一创新的联合不仅是新加坡乃至整个亚太地区云服务领域的重要里程碑,更是全球数字化转型进程中的关键一步。 观测云作为联盟的首批成员之一,在成立仪式上精彩亮相&#xff0…

探索能源管理体系认证的意义与实施

能源管理体系(Energy Management System, EnMS)是一个综合性的框架,旨在帮助企业系统地管理能源使用,提升能源效率,实现可持续发展的目标。这个体系包括了企业的组织结构、职责分配、惯例、程序、过程以及资源管理。通…

Linux中为qt添加opencv

一. 安装OpenCV库: 打开终端,输入以下命令安装OpenCV: sudo apt-get update sudo apt-get install libopencv-dev二. 配置Qt项目 在Qt Creator中打开项目,然后编辑.pro文件,添加以下内容: INCLUDEPATH …

2024年必备的9大CRM工具选购指南

本文介绍的工具有:纷享销客、Zoho CRM、八百客、红圈通、简道云、简信CRM、Salesforce、HubSpot CRM、Apptivo。 在选择合适的CRM系统时,许多企业面临着功能繁多、选择困难的痛点。对于中小企业来说,找到一个既能提高客户关系管理效率&#x…

Java基础-Java多线程机制

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 一、引言 二、多线程的基本概念 1. 线程与进程 2. 多线程与并发 3. 多线程的优势 三、Java多线程的实…

GUL图形化界面操作(上部)

目录 AWT Frame对象:创建窗口 ​编辑 该对象相关的属性 设置窗口大小(对象.setsize(int,int)) 让窗口可以显现出来(对象.setVisible(bool)) 设置窗口标题(对象.setTitle(String)) 设置窗…

MySQL学习(14):索引使用规则

1. 索引语法 #创建索引 create [unique|fulltext] index 索引名 on 表名 (字段名,...); #字段可以有多个 #如果不加unique或fulltext,那么将创建一个普通索引 #在InnoDB引擎小,创建的索引默认是Btree结构#查看索引 show index from 表名;#删除索引 drop…

折叠群控FPV穿越机技术详解

折叠群控FPV穿越机技术是一个结合了多项高端技术和飞行理念的创新系统。以下是该技术的详细解析: 1. 技术概述: - FPV穿越机:FPV,全称First Person View,即“第一人称视角”,是指通过无人机上搭载的摄像头&…

Python+Pytest+Allure+Yaml+Pymysql+Jenkins+GitLab运行原理

PythonPytestAllureYamlPymysqlJenkinsGitLab运行原理逻辑及调用关系 GitLab代码仓: Jenkins工作空间: 代码: 测试报告展示:

医疗器械上市欧美,需要什么样的网络安全相关申报文件?

医疗器械在欧美上市时,需要提交的网络安全相关申报文件主要包括以下几个方面,这些要求基于欧美地区的法律法规和监管机构的指导文件。 一、美国FDA要求 1. 网络安全管理计划 内容:制造商需要提交一份网络安全管理计划,该计划应包含…

blender顶点乱飞的问题解决

初学blender,编辑模式下移动某些顶点,不管是移动还是滑动都会出现定点乱飞的问题,后来才发现是开了吸附工具的原因!!!! 像下面这样,其实我只是在Z轴上移动,但是就跑的很…

经纬恒润与奇瑞汽车签订新能源项目重点供应商合作协议,共同开启合作新篇章

近日,2024年国家级芜湖经开区汽车零部件生态大会成功举行,经纬恒润受邀出席,与行业各伙伴齐聚经开区,同绘发展蓝图,助力经开区汽车产业高质量发展。会上,经纬恒润与奇瑞汽车签署合作协议,成为奇…

2-43 基于matlab的RBF网络自适应控制应用

基于matlab的RBF网络自适应控制应用,使用RBF网络逼近一级倒立摆模型中未知的非线性函数部分,即用RBF网络代替一级倒立摆模型中未知非线性函数部分,从而设计自适应控制,实现一级倒立摆的平衡控制。程序已调通,可直接运行…

卡夫卡(Kafka)框架详解:从背景到应用实践

卡夫卡(Kafka)框架详解:从背景到应用实践 引言 在大数据和分布式系统日益普及的今天,数据处理和消息传递成为了支撑复杂业务系统的关键基础设施。Apache Kafka,作为一个高性能的分布式消息队列系统,因其高…

qt 如何制作动态库插件

首先 首先第一点要确定我们的接口是固定的,也就是要确定 #ifndef RTSPPLUGIN_H #define RTSPPLUGIN_H #include "rtspplugin_global.h" typedef void (*func_callback)(uint8_t* data,int len,uint32_t ssrc,uint32_t ts,const char* ipfrom,uint16_t f…

C/C++樱花树代码

目录 写在前面 系列文章 C简介 完整代码 代码分析 写在后面 写在前面 C实现精美的樱花树,只需这100行代码! 系列文章 序号目录直达链接1爱心代码https://want595.blog.csdn.net/article/details/1363606842李峋同款跳动的爱心https://want595.b…

深入理解TCP:互联网通信的基石

深入理解TCP:互联网通信的基石 引言TCP的普遍应用TCP连接的建立与维护三次握手(Three-Way Handshake)连接的可靠性与超时重传数据传输与流量控制连接的终止状态转换 TCP与UDP的对比TCP协议栈的层级结构应用层(Application Layer&a…

24下软考初级-网络管理员100条知识点速记!

宝子们!上半年软考已经结束一段时间了,准备备考下半年软考初级-网络管理员的小伙伴可以开始准备了,这里给大家整理了100条网管知识点汇总,涵盖全书90%重点,先把这个存下!再慢慢看书,边看书边背这…