我一直在查看documentation of postgresql triggers,但它似乎只显示行级触发器的示例,但我无法找到语句级触发器的示例。
特别是,如何在单个语句中迭代更新/插入的行并不是很清楚,因为NEW
用于单个记录。
答案 0 :(得分:17)
OLD
和NEW
为空或未在语句级触发器中定义。 Per documentation:
NEW
数据类型
RECORD
;变量在行级触发器中保存INSERT
/UPDATE
个操作的新数据库行。 这个变量是 在语句级触发器和DELETE
操作中为null。
OLD
数据类型记录;变量保存行级触发器中
UPDATE
/DELETE
操作的旧数据库行。 此语句在语句级触发器和INSERT
操作中为空。
大胆强调我的。
直到Postgres 10,这读起来略有不同,但效果却相同:
...此变量在语句级触发器中未分配。 ...
虽然这些记录变量仍然没有用于语句级触发器,但新功能非常多:
Postgres 10引入了转换表。这些允许访问整组受影响的行。 The manual:
AFTER
触发器还可以使用转换表来检查由触发语句更改的整个行集。CREATE TRIGGER
命令为一个或两个转换分配名称 表,然后该函数可以像这些名称一样引用这些名称 是只读的临时表。 Example 43.7显示了一个示例。
请参阅代码示例手册的链接。
在转换表出现之前,这些更不常见。一个有用的例子是在某些DML命令之后发送notifications 这是我使用的基本版本:
-- Generic trigger function, can be used for multiple triggers:
CREATE OR REPLACE FUNCTION trg_notify_after()
RETURNS trigger AS
$func$
BEGIN
PERFORM pg_notify(TG_TABLE_NAME, TG_OP);
RETURN NULL;
END
$func$ LANGUAGE plpgsql;
-- Trigger
CREATE TRIGGER notify_after
AFTER INSERT OR UPDATE OR DELETE ON my_tbl
FOR EACH STATEMENT
EXECUTE PROCEDURE trg_notify_after();