如何在postgres中使用'for statement'触发器?

时间:2014-03-24 04:17:51

标签: sql postgresql

如果我们编写一个触发器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)

2 个答案:

答案 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触发器不支持OLDFOR EACH STATEMENT伪关系。

您必须使用FOR EACH ROW触发器。

理论上,PostgreSQL可能为新旧版本提供虚假表格,通过一些一次性生成的密钥连接在一起。或者包含新元组和旧元组作为复合类型的单个表。但是,目前还没有支持,据我所知,没有人正在努力支持它。

对于某些应用程序,将FOR EACH ROW触发器INSERT用于TEMPORARY表,然后在最终FOR EACH STATEMENT触发器中处理整个批次是值得的。