我一直在看documentation of postgresql triggers个,但它似乎只显示了行级触发器的示例,但我找不到语句级触发器的示例.

特别是,不太清楚如何在一条语句中迭代update/inserted行,因为NEW代表一条记录.

推荐答案

OLDNEW为空或未在语句级触发器中定义.Per documentation:

NEW

数据类型RECORD;在行级触发器中为INSERT/UPDATE操作保存新数据库行的变量.This variable is null in statement-level triggersDELETE次行动.

OLD

数据类型记录;在行级触发器中为UPDATE/DELETE操作保存旧数据库行的变量.This variable is null in statement-level triggersINSERT次手术.

我的.

到了第10期博士后,这种解读略有不同,但效果基本相同:

... 此变量在语句级触发器中为unassigned...

虽然这些记录变量对于语句级触发器仍然没有用处,但一个新特性是:

Postgres 10中的过渡表+

Postgres 10引入了过渡表.这些允许访问整个受影响的行集.The manual:

101触发器还可以使用transition tables判断由触发语句更改的整组行.

按照手册的链接查看代码示例.

Example statement-level trigger without transition tables

Before the advent of transition tables, those were even less common. A useful example is to send notifications after certain DML commands.
Here is a basic version of what I use:

-- Generic trigger function, can be used for multiple triggers:
CREATE OR REPLACE FUNCTION trg_notify_after()
  RETURNS trigger
  LANGUAGE plpgsql AS
$func$
BEGIN
   PERFORM pg_notify(TG_TABLE_NAME, TG_OP);
   RETURN NULL;
END
$func$;

-- Trigger
CREATE TRIGGER notify_after
AFTER INSERT OR UPDATE OR DELETE ON my_tbl
FOR EACH STATEMENT
EXECUTE PROCEDURE trg_notify_after();

对于Postgres 11或更高版本,请使用同等的、不太容易混淆的语法:

...
EXECUTE FUNCTION trg_notify_after();

见:

Postgresql相关问答推荐

环境变量在Bash应用程序中没有出现

使用PGx在围棋中执行多条SQL语句

mosquito-go-auth with postgres authorization error

如何在PostgreSQL中以行值的形式获取列

Psql:Windows 10上奇怪的错误输出编码

有没有一种方法可以在参数中添加密码,并在批处理文件中需要时自动获取密码?

在postgres中撤销Select后,RLS停止工作

Postgres 对 WHERE 子句并行使用两个索引

如何将 jackc/pgx 与连接池、上下文、准备好的语句等一起使用

为什么我的唯一索引在 Postgresql 中不起作用?

如何在不同的行中显示两列,避免重复并省略空条目

PostgreSQL ORDER BY 问题 - 自然排序

SQLAlchemy 中使用什么类型存储字节字符串?

如何让 Rails 使用 SSL 连接到 PostgreSQL?

使用 current_setting() 判断值

获取 psycopg2 count(*) 结果数

如何使用 Django Migrations 重新创建已删除的表?

SQL 基本类型:integer vs int?

Android 的 JDBC 与 Web 服务

Postgresql 用随机值更新每一行