描述Postgres 10中新功能的页面提到“触发器的转换表”。
触发器的转换表
AFTER STATEMENT
通过适当地向查询公开新旧行,此功能使触发器既有用又高效。在使用此功能之前,AFTER STATEMENT
触发器无法直接访问这些触发器,并且变通办法是拜占庭式的并且性能较差。现在,可以将许多触发逻辑编写为AFTER STATEMENT
,从而避免了对FOR EACH ROW触发器所需的每一行进行昂贵的上下文切换的需要。
什么是过渡表?
描述Postgres 10中新功能的页面提到“触发器的转换表”。
触发器的转换表
AFTER STATEMENT
通过适当地向查询公开新旧行,此功能使触发器既有用又高效。在使用此功能之前,AFTER STATEMENT
触发器无法直接访问这些触发器,并且变通办法是拜占庭式的并且性能较差。现在,可以将许多触发逻辑编写为AFTER STATEMENT
,从而避免了对FOR EACH ROW触发器所需的每一行进行昂贵的上下文切换的需要。
什么是过渡表?
Answers:
我非常喜欢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();
一些附加说明
AFTER
触发器上可用。ON CONFLICT
。重要的是要指出,它并不是完全确定可以在PG 10中使用。过渡表存在很多未解决的问题。大多数都有补丁。有一些内f是一种例行公事。似乎繁重的工作被别人接走了。该线程表明我们很快就会知道。