当多个插入之一的函数失败但执行了触发器时,Postgresql 捕获回滚

Postgresql catch rollback when function fails on one of multiple inserts but trigger was executed

我有 plpgsql 函数可以对多个 table 进行多次插入。 我还触发了做一些事情 f.g 通知一些服务。

过程如下所示:

  1. 插入 table A
  2. 触发器在 table A
  3. 上执行
  4. 函数失败于 插入 table B

然后事务回滚,tableA 中没有数据,但触发器已执行。 此外,table A.

上没有任何 DELETE

我的触发器和函数:

CREATE OR REPLACE FUNCTION some_function() RETURNS trigger AS
$$
BEGIN
    PERFORM pg_notify('pgchannel1', row_to_json(new)::text);
    RETURN NULL;
END
$$ LANGUAGE plpgsql;

CREATE TRIGGER some_trigger
    AFTER INSERT
    ON some_table
    FOR EACH ROW
EXECUTE PROCEDURE some_function();

我想要这样的流程:

  1. 插入 table A
  2. 插入table B
  3. 触发器执行于 table A / 触发器在函数完成时执行

我如何才能发现事务已回滚且未执行触发器? 有什么方法可以触发函数状态吗?

是的,您可以使用 约束触发器:

CREATE CONSTRAINT TRIGGER some_trigger
   AFTER INSERT ON some_table
   DEFERRABLE INITIALLY DEFERRED FOR EACH ROW
EXECUTE PROCEDURE some_function();

这样的触发器将在交易结束时触发,而不是立即触发。