如果我们编写一个触发器FOR STATEMENT,如下所示我们如何才能访问触发器过程/函数中的更新行
CREATE FUNCTION func1()
RETURNS trigger AS $$
BEGIN
--access only updated/inserted rows here???
RETURN null;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trig1
AFTER UPDATE OR DELETE OR INSERT
ON tbl1 FOR STATEMENT
EXECUTE PROCEDURE func1();
我的意思是当有多个行更新一次时,如下所示
update tbl1 set col1=1 where col2 in (2,3,4,5,6)
答案 0 :(得分:4)
现在,可以在第10页中使用插入记录表的标识符:
CREATE TRIGGER transfer_insert
AFTER INSERT ON transfer
REFERENCING NEW TABLE AS inserted
FOR EACH STATEMENT
EXECUTE PROCEDURE check_transfer_balances_to_zero();
摘自第10页doc:https://www.postgresql.org/docs/10/static/sql-createtrigger.html
答案 1 :(得分:2)
目前,NEW
触发器不支持OLD
和FOR EACH STATEMENT
伪关系。
您必须使用FOR EACH ROW
触发器。
理论上,PostgreSQL可能为新旧版本提供虚假表格,通过一些一次性生成的密钥连接在一起。或者包含新元组和旧元组作为复合类型的单个表。但是,目前还没有支持,据我所知,没有人正在努力支持它。
对于某些应用程序,将FOR EACH ROW
触发器INSERT
用于TEMPORARY
表,然后在最终FOR EACH STATEMENT
触发器中处理整个批次是值得的。