PostgreSQL 15如何创建SQL语句级触发器

轻萱大大_3005

轻萱大大_3005

2026-08-07

153人浏览

原创

postgresql 15 中语句级触发器必须显式声明 for each statement 且函数必须返回 null;不可使用 new/old,误写 return new 或漏写 return null 会导致执行失败,且 create trigger 必须明确指定触发级别。

postgresql 15如何创建sql语句级触发器

PostgreSQL 15 中语句级触发器必须显式声明 FOR EACH STATEMENT,且触发器函数必须返回 NULL —— 漏写 RETURN NULL 会导致执行失败。

语句级触发器的函数必须返回 NULL

语句级触发器不处理单行数据,因此不能用 NEW 或 OLD,也不应返回 NEW 或 OLD。它的唯一合法返回值是 NULL,且必须显式写出。

  • RETURN NULL 是强制要求,不是可选;隐式无返回会被 PostgreSQL 当作 RETURN NULL 处理,但部分版本(如 15.6+)在严格模式下会报错或行为不一致
  • 若误写 RETURN NEW,插入/更新语句会直接失败,并提示 ERROR: record "new" is not assigned
  • 函数返回类型仍需声明为 TRIGGER,但内部逻辑不依赖行变量

CREATE TRIGGER 语法中必须指定 FOR EACH STATEMENT

仅靠函数逻辑无法决定触发级别,必须在 CREATE TRIGGER 语句中明确标注,否则默认是行级(FOR EACH ROW)。

稿定AI
稿定AI

一款融合AI图像生成与智能编辑能力的在线设计工具,可辅助完成图片重绘、线稿处理和人物视觉优化等创作任务。

下载
  • 错误写法:CREATE TRIGGER log_after_insert AFTER INSERT ON users EXECUTE FUNCTION log_statement() → 默认行级,函数里没 NEW 就崩
  • 正确写法:CREATE TRIGGER log_after_insert AFTER INSERT ON users FOR EACH STATEMENT EXECUTE FUNCTION log_statement()
  • FOR EACH STATEMENT 和 FOR EACH ROW 不能共存;同一事件上可同时定义多个触发器,但级别必须分开声明

典型使用场景:批量操作审计、统计更新、权限拦截

语句级适合不关心“改了哪几行”,只关心“有没有执行这个动作”的场景。

  • 记录一次 DELETE FROM logs WHERE ts 的执行时间,而不是逐条记日志
  • 在 UPDATE 语句后刷新物化视图:REFRESH MATERIALIZED VIEW stats_summary
  • 拦截高危语句:用 event_trigger 更合适,但普通语句级触发器可用于表级限制,例如禁止空条件的 UPDATE:IF TG_OP = 'UPDATE' AND NOT EXISTS (SELECT 1 FROM pg_trigger WHERE tgname = TG_NAME) THEN RAISE EXCEPTION 'Unsafe UPDATE without WHERE'; END IF;(注意:实际判断需查 pg_stat_statements 或解析 TG_TAG,此处仅为示意逻辑位置)

容易被忽略的兼容性细节

PostgreSQL 15 对语句级触发器的行为做了更严格的校验,尤其在事务嵌套和触发器链中。

  • TRUNCATE 只支持语句级触发器,不支持行级;TRUNCATE ... CASCADE 会分别触发各表上的语句级触发器
  • 如果一个语句同时触发多个语句级触发器(比如两个 AFTER INSERT),它们按触发器名字母序执行,而非创建顺序
  • 函数内调用 RAISE EXCEPTION 会中止整个语句,且已执行的修改(如前面的 INSERT)会回滚 —— 这点和行级不同,行级可对某几行跳过而不影响其他行

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

sql语句

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
postgresql常用命令
postgresql常用命令

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、\l、\c、\dt、\d table_name、\du、\i file_name、\e和\q等。本专题为大家提供postgresql相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.10

213

5

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4329

19

postgresql常用命令有哪些
postgresql常用命令有哪些

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、\l、\c、\dt、\d table_name、\du、\i file_name、\e和\q等。更详细的postgresql常用命令,大家可以访问下面的文章。

2023.11.16

627

3

postgresql常用命令介绍
postgresql常用命令介绍

postgresql常用命令有\l、\d、\d5、\di、\ds、\dv、\df、\dn、\db、\dg、\dp、\c、\pset、show search_path、ALTER TABLE、INSERT INTO、UPDATE、DELETE FROM、SELECT等。想了解更多postgresql的相关内容,可以阅读本专题下面的文章。

2023.11.20

1376

6

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

2026.02.12

460

19

PostgreSQL 性能优化与查询执行计划实战
PostgreSQL 性能优化与查询执行计划实战

本专题深入解析PostgreSQL性能优化核心,聚焦查询执行计划的实战应用。通过EXPLAIN命令精准定位瓶颈,结合索引策略、SQL改写与参数调优,系统提升查询效率。从执行计划解读到性能调优全流程,助你掌握数据库性能诊断与优化实战能力。

2026.05.08

150

10

PostgreSQL 在 Next.js / Go 全栈架构中的工程化实践
PostgreSQL 在 Next.js / Go 全栈架构中的工程化实践

本文详解如何利用Next.js(搭配Drizzle ORM)与Go后端构建高性能应用,充分发挥PG在JSONB非结构化存储与pgvector向量检索上的优势。从数据建模到Docker容器化部署,打造支持AI时代的“One Database”工程化解决方案。

2026.05.08

881

10

PostgreSQL高级特性、内核机制与现代数据架构
PostgreSQL高级特性、内核机制与现代数据架构

本专题从MVCC并发控制与WAL日志等内核机制出发,详解JSONB、PostGIS及pgvector等高级特性。探讨如何利用单一引擎支撑关系型、向量及图数据等现代数据架构需求,助您掌握构建高并发、智能化应用的核心技术。

2026.05.08

224

10

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

2023.06.29

2505

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PDO数据库抽象层
PDO数据库抽象层

共7课时 | 3.3万人学习