在Postgres中什么是“转换表”?


12

描述Postgres 10新功能的页面提到“触发器的转换表”。

触发器的转换表

AFTER STATEMENT通过适当地向查询公开新旧行,此功能使触发器既有用又高效。在使用此功能之前,AFTER STATEMENT触发器无法直接访问这些触发器,并且变通办法是拜占庭式的并且性能较差。现在,可以将许多触发逻辑编写为AFTER STATEMENT,从而避免了对FOR EACH ROW触发器所需的每一行进行昂贵的上下文切换的需要。

什么是过渡表?

Answers:


12

您知道触发器有多少OLDNEW记录变量FOR EACH ROW吗?

过渡表是FOR EACH STATEMENT等效的。它们是包含新元组和旧元组的表,因此您的触发器可以看到发生了什么变化。


9

我非常喜欢Craig对功能的解释。SQL-2011规范在触发器的上下文中将它们定义为“被删除,插入或替换的行的集合称为过渡表”。一个类似的解释是在文档提供,

虽然转换表AFTER正在使用的指定触发器REFERENCING以标准方式子句中使用的行的变量FOR EACH ROW触发器可不在指定REFERENCING子句。它们的使用方式取决于编写触发功能的语言。有些语言的行为好像有一个REFERENCING子句包含OLD ROW AS OLD NEW ROW AS NEW.

从本质上讲,它们使您可以使用整个语句的更改,这非常方便。供参考,创建触发器上的DDL类似于过渡表

REFERENCING OLD TABLE AS oldtable NEW TABLE AS newtable

您可以在此处看到一个示例,这是测试套件中的一个示例

CREATE TABLE transition_table_base (id int PRIMARY KEY, val text);

CREATE FUNCTION transition_table_base_ins_func()
  RETURNS trigger
  LANGUAGE plpgsql
AS $$
DECLARE
  t text;
  l text;
BEGIN
  t = '';
  FOR l IN EXECUTE
           $q$
             EXPLAIN (TIMING off, COSTS off, VERBOSE on)
             SELECT * FROM newtable
           $q$ LOOP
    t = t || l || E'\n';
  END LOOP;

  RAISE INFO '%', t;
  RETURN new;
END;
$$;

CREATE TRIGGER transition_table_base_ins_trig
  AFTER INSERT ON transition_table_base
  REFERENCING OLD TABLE AS oldtable NEW TABLE AS newtable
  FOR EACH STATEMENT
  EXECUTE PROCEDURE transition_table_base_ins_func();

一些附加说明

  1. 它们仅在AFTER触发器上可用。
  2. 他们考虑到类似的东西ON CONFLICT

重要的是要指出,它并不是完全确定可以在PG 10中使用过渡表存在很多未解决的问题。大多数都有补丁。有一些内f是一种例行公事。似乎繁重的工作被别人接走了。该线程表明我们很快就会知道。

作者回应-似乎又恢复了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.