我一直在看postgresql触发器的文档,但它似乎只显示了行级触发器的示例,但我找不到语句级触发器的示例
特别是,由于NEW是针对单个记录的,因此不太清楚如何在单个语句中迭代update/inserted行
OLD和NEW为空或未在语句级触发器中定义。根据文件:
NEW数据类型
记录;为行级触发器中的插入/更新操作保存新数据库行的变量此变量为
语句级触发器中的null和用于DELETE操作
OLD数据类型记录;为行级触发器中的
更新/删除操作保存旧数据库行的变量此变量在语句级触发器和插入操作中为空
我的
到了第10期博士后,这种解读略有不同,但效果基本相同:
。。。在语句级触发器中,此变量是未分配的
虽然这些记录变量对于语句级触发器仍然没有用处,但一个新特性是:
postgres-10-nxe5中的转换表+
Postgres 10引入了过渡表。这些允许访问整个受影响行集。手册:
AFTER触发器还可以使用转换表检查由触发语句更改的整组行。
CREATE TRIGGER命令为一个或两个转换指定名称
表,然后函数可以引用这些名称,就好像它们
是只读的临时表。示例43.7显示了一个示例
按照手册的链接获取代码示例
example-statement-level-triggerwithout-transition-tables
在过渡表出现之前,这种情况更不常见。一个有用的示例是在某些DML命令之后发送通知。
以下是我使用的基本版本:
--通用触发器功能,可用于多个触发器:
创建或替换函数trg_notify_after()
返回触发器
语言plpgsql AS
$func$
开始
执行pg_通知(TG_表格名称,TG_OP);
返回NULL;
终止
$func$;
--触发
创建触发器后通知
在我的tbl上插入、更新或删除后
对于每个语句
执行程序trg_notify_after()
对于Postgres 11或更高版本,请使用同等的、不太容易混淆的语法:
。。。
执行函数trg_notify_after();
见:
- 触发器函数不存在,但我很确定它确实存在