对于每个语句触发器示例

时间:2014-06-12 20:42:54

标签: postgresql plpgsql triggers

我一直在查看documentation of postgresql triggers,但它似乎只显示行级触发器的示例,但我无法找到语句级触发器的示例。

特别是,如何在单个语句中迭代更新/插入的行并不是很清楚,因为NEW用于单个记录。

1 个答案:

答案 0 :(得分:17)

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

  

NEW

     

数据类型RECORD;变量在行级触发器中保存INSERT / UPDATE个操作的新数据库行。 这个变量是   在语句级触发器DELETE操作中为null。

     

OLD

     

数据类型记录;变量保存行级触发器中UPDATE / DELETE操作的旧数据库行。 此语句在语句级触发器INSERT操作中为空。

大胆强调我的。

直到Postgres 10,这读起来略有不同,但效果却相同:

  

...此变量在语句级触发器中未分配。 ...

虽然这些记录变量仍然没有用于语句级触发器,但新功能非常多:

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();