postgresql-触发器

PostgreSQL 触发器 PostgreSQL触发器是一种强大的数据库对象,它可以在特定的数据库事件发生时自动执行预定义的操作。这些事件可以是插入、更新或删除表中的行。触发器通常用于强制复杂的业务规则、审计更改、同步复制数据到其他表或文件,以及提供复杂的引用完整性。 阅读详情

触发器概述

PostgreSQL 触发器(trigger)是一种特殊的函数,当某个数据变更事件(INSERT、UPDATE、
DELETE 或者 TRUNCATE 语句)或者数据库事件(DDL 语句)发生时自动执行,而不是由用
户或者应用程序进行调用

基于某个表或者视图数据变更的触发器被称为数据变更触发器(DML 触发器),基于数据
库事件的触发器被称为事件触发器(DDL 触发器)。一般我们更多使用的是数据变更触发器
在这里插入图片描述
对于数据变更触发器,PostgreSQL 支持两种级别的触发方式:行级(row-level)触发器和 语句级(statement-level)触发器。这两者的区别在于触发的时机和触发次数。例如,对于一个
影响 20 行数据的 UPDATE 语句,行级触发器将会触发器 20 次,而语句级触发器只会触发 1 次

触发器可以在事件发生之前(BEFORE)或者之后(AFTER)触发。如果在事件之前触发,
它可以跳过针对当前行的修改,甚至修改被更新或插入的数据;如果在事件之后触发,触发器可
以获得所有的变更结果。INSTEAD OF 触发器可以用于替换数据变更的操作,但只能基于视图
定义

下表列出了 PostgreSQL 中支持的各种触发器:

触发时机触发事件行级触发器语句级触发器
beforeinsert update delete表和外部表表、视图和外部表
beforetruncate表
afterinsert update delete表和外部表表 视图和外部表
aftertruncate表
instead ofinsert update delete视图

触发器对于多应用共享的数据库而言非常有用,可以将跨应用的功能存储在数据库中,当表
中的数据发生任何变化时都会自动执行触发器的操作。例如,可以用触发器实现数据修改的历史
审计,而不需要各种应用程序实现任何相关的逻辑。

另外,触发器还可以用于实现复杂的数据完整性和业务规则。例如,在非业务时间不允许修
改用户的信息。

但是另一方面,触发器可能带来的问题就是在不清楚它们的存在和逻辑时可能会影响数据修
改的结果和性能。

创建触发器

PostgreSQL 触发器的创建分为两步:

  1. 使用 CREATE FUNCTION 语句创建一个触发器函数
  2. 使用 CREATE TRIGGER 语句将该函数与表进行关联
-- 语法
CREATE [ OR REPLACE ] FUNCTION trigger_function ()
 RETURNS trigger
AS $$
DECLARE
 declarations
BEGIN
 statements;
 ...
END; $$
LANGUAGE plpgsql;

触发器函数与普通函数的区别在于它没有参数,并且返回类型为 trigger;在触发器函数的内部,系统自动创建了许多特殊的变量:

  • NEW ,类型为 RECORD,代表了行级触发器 INSERT、UPDATE 操作之后的新数据行。
    对于 DELETE 操作或者语句级触发器而言,该变量为 null;
  • OLD,类型为 RECORD,代表了行级触发器 UPDATE、DELETE 操作之前的旧数据行。
    对于 INSERT 操作或者语句级触发器而言,该变量为 null;
  • TG_NAME,触发器的名称;
  • TG_WHEN,触发的时机,例如 BEFORE、AFTER 或者 INSTEAD OF
  • TG_LEVEL,触发器的级别,ROW 或者 STATEMENT;
  • TG_OP,触发的操作,INSERT、UPDATE、DELETE 或者 TRUNCATE;
  • TG_RELID,触发器所在表的 oid;
  • TG_TABLE_NAME,触发器所在表的名称;
  • TG_TABLE_SCHEMA,触发器所在表的模式;
  • TG_NARGS,创建触发器时传递给触发器函数的参数个数;
  • TG_ARGV[],创建触发器时传递给触发器函数的具体参数,下标从 0 开始。非法的下标
    (小于 0 或者大于等于 tg_nargs)将会返回空值。
-- 使用 CREATE TRIGGER 语句创建一个触发器,语法如下:
CREATE TRIGGER trigger_name
{BEFORE | AFTER | INSTEAD OF} {event [OR ...]}
 ON table_name
 [FOR [EACH] {ROW | STATEMENT}]
 [WHEN ( condition ) ]
 EXECUTE FUNCTION trigger_function;

其中,event 可以是 INSERT、UPDATE、DELETE 或者 TRUNCATE,UPDATE 支持特定字
段(UPDATE OF col1, clo2)的更新操作;触发器可以在事件之前(BEFORE)或者之后(AFTER)
触发,INSTEAD OF 只能用于替代视图上的 INSERT、UPDATE 或者 DELETE 操作;FOR EACH
ROW 表示行级触发器,FOR EACH STATEMENT 表示语句级触发器;WHEN 用于指定一个额
外的触发条件,满足条件才会真正支持触发器函数

我们通过触发器来实现记录员工的信息变更历史,首先创建一个历史记录表
employees_history:

create table employees_history (
 id serial primary key,
 employee_id int null,
 first_name varchar(20) null,
 last_name varchar(25) null,
 email varchar(25) null,
 phone_number varchar(20) null,
 hire_date date null,
 job_id varchar(10) null,
 salary numeric(8,2) null,
 commission_pct numeric(2,2) null,
 manager_id int null,
 department_id int null,
 action_type varchar(10) not null,
 change_dt timestamp not null
);
-- 定义一个触发器函数 track_employees_change
-- 该函数根据不同的操作记录了相应的历史信息、操作类型和操作时间。
create or replace function track_emp_change()
returns trigger 
as $$
begin 
	-- tg_op 触发的操作 
	if tg_op = 'INSERT' then
		insert into public.employees_history
		(employee_id, first_name, last_name, email, phone_number, 
		hire_date, job_id, salary, commission_pct, manager_id,
		department_id, action_type, change_dt)
		values(new.employee_id, new.first_name, new.last_name, 
		new.email, new.phone_number, new.hire_date, new.job_id, new.salary,
		new.commission_pct, new.manager_id, new.department_id,'INSERT'
		,current_timestamp);
	elsif tg_op = 'UPDATE' then
		insert into public.employees_history
		(employee_id, first_name, last_name, email, phone_number, 
		hire_date, job_id, salary, commission_pct, manager_id,
		department_id, action_type, change_dt)
		values(old.employee_id, old.first_name, old.last_name, 
		old.email, old.phone_number, old.hire_date, old.job_id, old.salary,
		old.commission_pct, old.manager_id, old.department_id,'UPDATE'
		,current_timestamp);
	elsif tg_op = 'DELETE' then
		insert into public.employees_history
		(employee_id, first_name, last_name, email, phone_number, 
		hire_date, job_id, salary, commission_pct, manager_id,
		department_id, action_type, change_dt)
		values(old.employee_id, old.first_name, old.last_name, 
		old.email, old.phone_number, old.hire_date, old.job_id, old.salary,
		old.commission_pct, old.manager_id, old.department_id, 'DELETE'
		,current_timestamp);
	end if;
	return new;
end $$
language plpgsql;
-- 最后创建一个触发器 trg_employees_change,将该函数与 employees 进行关联:
create trigger trg_employees_change
 before insert or UPDATE or DELETE
 on employees
 for each row
 execute function public.track_emp_change();
-- 测试
insert into employees(employee_id, first_name, last_name, email, phone_number,
hire_date, job_id, salary, commission_pct, manager_id, department_id)
values(208, 'Tony', 'Dong', 'TonyDong', '01066665678', '2020-05-25',
'IT_PROG', 6000, null, 103, 60);
SELECT * FROM employees_history;
--我们往 employees 中插入一条记录之后,employees_history 记录了这一操作历史;对于
--UPDATE 和 DELETE 操作也是如此

在这里插入图片描述

管理触发器

PostgreSQL 提供了 ALTER TRIGGER 语句,用于修改触发器:

-- 修改触发器的名称
ALTER TRIGGER name ON table_name RENAME TO new_name;
-- PostgreSQL 还支持触发器的禁用和启用:
ALTER TABLE table_name
{ENABLE | DISABLE} TRIGGER {trigger_name | ALL | USER};

默认创建的触发器处于启用状态;我们也可以使用以上语句禁用或者启用某个触发器、某个
表上的所有触发器(ALL)或用户触发器(不包括内部生成的约束触发器,例如用于外键约束或
延迟唯一性约束以及排除约束的触发器)

视图 information_schema.triggers 中存储了关于触发器的信息

select * from information_schema.triggers;

在这里插入图片描述

删除触发器

-- 被禁用的触发器仍然存在,只是不会被触发;如果想要删除触发器,可以使用 DROP TRIGGER 语句
DROP TRIGGER [IF EXISTS] trigger_name
ON table_name [RESTRICT | CASCADE];

IF EXISTS 可以避免触发器不存在时的错误提示;CASCADE 表示级联删除依赖于该触发器
的对象,RESTRICT 表示如果存在依赖于该触发器的对象返回错误,默认为 RESTRICT。

-- 将 employees 表上的触发器 trg_employees_change 删除
-- 虽然删除了触发器,但是触发器函数 track_employees_change 仍然存在。
drop trigger trg_employees_change on employees;

在这里插入图片描述

事件触发器

除了数据变更触发器之外,PostgreSQL 还提供了另一种触发器:事件触发器 。事件触发器
主要用于捕获全局的 DDL 事件,目前支持 ddl_command_start、ddl_command_end、table_rewrite
和 sql_drop,这些事件支持的完整语句可以参考官网

对于事件触发器的函数而言,同样预定义了两个变量:

  • TG_EVENT,触发事件;
  • TG_TAG,触发语句。
    对于事件触发器,首先也需要创建一个函数,返回类型为 event_trigger
create or replace function abort_any_command()
returns event_trigger
as $$
begin 
-- 判断当前操作用户是否为超级用户(postgres),如果不是则不允许执行任何 DDL语句。
	if (user != 'postgres') then
	 raise exception '禁止%命令',tg_tag;	
	end if;
end $$
language plpgsql;

创建事件触发器

-- 使用 create event trigger 语句创建事件触发器:
create event trigger abort_ddl on ddl_command_start
 execute function abort_any_command();

修改触发器

-- alter event trigger 语句可以启用/禁用事件触发器或者修改触发器的名称等:
alter event trigger name disable;
alter event trigger name enable;
alter event trigger name rename to new_name;

删除事件触发器

--drop event trigger 语句可以用于删除事件触发器:
drop event trigger [ if exists ] name [ cascade | restrict ];
-- 删除事件触发器 abort_ddl 
drop event trigger abort_ddl;
PG数据库之触发器详解 PostgreSQL中的触发器是一种在特定数据库事件(如插入、更新、删除)发生时自动执行的函数。触发器可用于强制业务规则、记录审计日志、同步数据等。PostgreSQL支持多种触发器类型,包括行级、语句级和INSTEAD OF触发器,以及处理DDL事件的事件触发器。创建触发器需先定义触发器函数,该函数在触发器被触发时执行,并返回trigger类型的值。 阅读详情

相关推荐

PostgreSQL中事件触发器Event Trigger

事件触发器是PostgreSQL中强大的工具,允许数据库管理员在数据库级别实施全局策略和执行自动化任务。

zxrhhm的博客 1604

PostgreSql 触发器

PostgreSQL从9.3 版开始支持一种称为"Event Trigger"的触发器,这种触发器主要用于弥补PostgreSQL 以前版本不支持 DDL 触发器的不足。由于事件触发器涉及的权限较大,比如能禁止 DDL 操作等,所以只有超级用户才能创建和修改事件触发器。目前,事件触发器支持以下 3 种 DDL 事件。:DDL开始执行前被触发。:一个DDL执行完成后被触发。sql_drop:删除数据库对象前被触发。

脑子进水养啥鱼?的博客 8860

《PostgreSQL开发指南》第27篇 触发器

PostgreSQL 触发器(trigger)是一种特殊的函数,当某个数据变更事件(INSERT、UPDATE、DELETE 或者 TRUNCATE)或者数据库事件(DDL 语句)发生时自动执行,而不是由用户或者应用程序进行调用。 基于某个表或者视图数据变更的触发器被称为数据变更触发器(DML 触发器),基于数据库事件的触发器被称为事件触发器(DDL 触发器)。

Tony.Dong的专栏 1910

postgreSQL触发器

触发器是某个数据库操作发生时被**自动调用的函数**。可以在`INSERT`、`UPDATE`或`DELETE`操作之前或之后调用触发器。`PostgreSQL`支持两种类型的触发器,一种是**数据行级触发器**,另外一种是**语句级触发器**。对于数据行级的触发器,触发发触发器的语句每操作一个数据行,它就被执行一次。对于语句级的触发器,它只会被执行一次。

qq_25775675的博客 5782

GD32 TIMER0 PWM输出死活没波形?别忘了这个关键配置(附完整代码)

本文详细解析了GD32 TIMER0 PWM输出无波形的常见问题,特别强调了高级定时器特有的主输出使能配置。通过完整的代码示例和调试技巧,帮助开发者快速解决PWM输出问题,适用于无刷电机控制等嵌入式应用场景。

weixin_30906185的博客 397

【数据中台】数据中台架构搭建百科全书

0、前言 当前,大部分企业不再建设从源数据采集到分析应用的烟囱式系统,更倾向于数据集中采集、存储,并应用分层建设。这种方式一方面有利于应用系统的快速部署,另一方面也保证了数据的集中管理与运营,体现数据的资产、资源属性。 数据中台的出现弥补了数据开发和应用开发之间由于开发速度不匹配而出现的响应力不足等缺陷问题。 数据中台是国内学者提出的概念,起始于阿里的“大中台、小前台”概念。阿里的中台是从管理的角度出发,以中台事业部集中数据搜索,技术及产品,数据共享等多个部门的功能。其他组织或企业建设数据中台不一定需

Sunny的专栏 8405

PostgreSQL 触发器详解:从原理到实战

本文详细介绍了PostgreSQL触发器的原理与应用。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 1万+

手把手教你用Cadence Virtuoso完成LNA全套仿真:基于SpectreRF手册的实战补充

本文详细指导如何使用Cadence Virtuoso和SpectreRF完成LNA的全套仿真,涵盖噪声仿真、增益压缩、THD分析及双音IP3测量等关键步骤。针对官方手册中的常见问题,提供了12个实战解决方案,包括hbnoise函数选择、双音信号源配置等,帮助工程师高效完成射频IC设计。

weixin_29102619的博客 519

PostgreSQL——触发器

BEFORE触发器通常在语句开始做任何事情之前触发,AFTER触发器则在语句结束时触发。触发程序与表相关,当对表执行INSERT、DELETE或UPDATE语句时,将激活触发程序。如果定义INSERT之前,表明在数据库插入之前,先调用触发器,再执行触发器函数。从执行的结果来看,在studentl表插入记录之后,触发器计算插入到studentl表中的数据,并将结果插入到studentl stats表中相应的位置。在某些触发程序的用法中,可用于检查插入到表中的值,或对更新涉及的值进行计算。

吴声子夜歌的博客 853

SAP Business Technology Platform 支持的技术栈

SAP Business Technology Platform(简称 BTP)是 SAP 提供的一个综合技术平台,旨在帮助企业实现业务转型和创新。BTP 融合了数据库管理、应用开发、集成、分析和智能技术,为企业提供从基础架构到端到端应用的全面服务。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1566

猫群优化算法(CSO)详解:从生物灵感到智能优化

猫群优化算法(CSO)是一种模拟猫科动物行为的群体智能优化算法。该算法基于猫的两种主要行为模式:搜寻状态(全局探索)和跟踪状态(局部开发)。CSO通过混合率(MR)动态调整两种模式的比例,实现探索与开发的平衡。算法核心包括搜寻模式的变异操作和跟踪模式的速度-位移模型,具有收敛性能好、全局搜索能力强等特点。相比传统优化算法,CSO在高维复杂问题中表现优异,已成功应用于函数优化、图像处理等多个领域。算法性能受混合率、变化域等参数影响,自适应参数策略可进一步提升优化效果。

qq_42212808的博客 617

postgresql触发器详解

触发器(Trigger)是由事件自动触发执行的一种特殊的存储过程,触发事件可以是对一个表进行INSERT、UPDATE、DELETE等操作。触发器经常用于加强数据的完整性约束和业务规则上的约束等在数据库中,为了提高自动化效率,往往会配置一些触发器,由某一事件的发生而触发运行指定的函数,增加数据库运行的自动化效率。在postgresql数据库中分为普通触发器和事件触发器在用法上有区别。

weixin_73350116的博客 3276

Cadence PCB 仿真宝典【目录】

欢迎大家来到《Cadence PCB 仿真宝典》该专栏包括【入门篇】【提升篇】【技巧篇】【疑难篇】四个部分,以供大家参考。大家直接点击大纲中的蓝色标题即可轻松传送。

fydar的博客 3267

PostgreSQL15——触发器

PostgreSQL 触发器 (trigger)是一种特殊的函数,当某个数据变更事件(INSERT、 UPDATE、DELETE 或者 TRUNCATE 语句)或者数据库事件(DDL 语句)发生时自动执行,而不是由用户或者应用程序进行调用。基于某个表或者视图数据变更的触发器被称为数据变更触发器(DML 触发器),基于数据库事件的触发器被称为事件触发器(DDL 触发器)。一般我们更多使用的是数据变更触发器。

吴声子夜歌的博客 1138

Vue3 - 详细实现微信公众号H5网页内置浏览器中预览下载word文档(doc)、excel表格(xls)、ppt文稿、pdf文档等文件,微信内部直接打开预览和下载到本地教程,安卓苹果手机无差异兼容

vue3,nuxt3,微信公众号,h5,移动端,网页,网站,vue微信内置浏览器下载文件,下载文件,在微信浏览器里面实现下载任意文件,H5需要在微信浏览器中下载excel文件,实现网页在微信内置浏览器中下载文件详细教程,安卓点击下载会提示打开浏览器,后端返回流文件,如何解决无法下载文件,跳转至浏览器下载文件,发送到电脑微信,安卓,苹果,手机系统,微信H5页面,vue3微信公众号H5网站,内置浏览器下载文档,如何在微信浏览器中预览office文件,word文档,excel文档,pdf文档,ppt文档,offi

🏆 前端领域优质创作者 1万+

Docker/Hyper-V/Wsl2等虚拟化组件一键切换工具 (附源码, Docker Desktop开发模式与三角洲游戏模式一键切换工具)

开启 Docker、Hyper-V 或 WSL2 后游戏无法启动?🎮💻 本文教你用一键批处理工具⚡快速切换“开发/游戏模式”,开发娱乐两不误!🔄✨

XiaoqiangClub的博客 697

postgresql 删除触发器_PostgreSQL 触发器

PostgreSQL 触发器PostgreSQL 触发器是数据库的回调函数,它会在指定的数据库事件发生时自动执行/调用。下面是关于 PostgreSQL 触发器几个比较重要的点:PostgreSQL 触发器可以在下面几种情况下触发:在执行操作之前(在检查约束并尝试插入、更新或删除之前)。在执行操作之后(在检查约束并插入、更新或删除完成之后)。更新操作(在对一个视图进行插入、更新、删除时)。触发器的...

weixin_39938855的博客 1315

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

postgresql 删除触发器_PostgreSQL触发器

PostgreSQL的触发器是数据库自动执行\指定的数据库事件发生时调用的回调函数。以下是有关PostgreSQL的触发器的要点: www.yiibai.comPostgreSQL的触发可以指定触发操作前尝试一行(在检查约束之前INSERT,UPDATE或DELETE)或操作完成后(在检查约束之后和INSERT,UPDATE或DELETE(删除)已完成),或替代的操作(在视图上插入,更新或删除的情...

weixin_39694016的博客 1353

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

PostgreSQL触发器详解

1、触发器的定义 触发器声明了当执行一种特定类型的操作时数据库应该自动执行一个特殊的函数。触发器可以被附加到表(分区或不分区)、视图和外部表。 2、触发器的语法 CREATE [ CONSTRAINT ] TRIGGER name { BEFORE | AFTER | INSTEAD OF } { event [ OR ... ] } ON table_name [ FROM re...

Focus on PostgreSQL 9403

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

PostgreSQL11 | 触发器

本文根据原书《PostgreSql11 从入门到精通》(清华大学出版社)第11章总结整理,为提问与解答可以帮助更多人,本博客模拟GitHub的issue方案,所以私信已关,有问题请在评论区直接指正与提问,允许转发、复制或引用本文章,必须遵守开源法则注释来源与作者,感谢您的阅读。

红星编程实验室 1776

postgresql 删除触发器_postgresql 触发器

一、创建事件触发器1、ddl_command_start - 一个DDL开始执行前被触发;2、ddl_command_end - 一个DLL 执行完成后被触发;3、sql_drop -- 删除一个数据库对象前被触发;create or replace function abort_any_command()returns event_triggerlanguage plpgsqlas $$begi...

weixin_39692623的博客 422
上一篇: postgresql-存储过程
下一篇: postgresql用户和角色
迷失的小鹿
博客等级 码龄8年 1万+粉丝 199原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值