当多个插入之一的函数失败但执行了触发器时,Postgresql 捕获回滚
Postgresql catch rollback when function fails on one of multiple inserts but trigger was executed
我有 plpgsql 函数可以对多个 table 进行多次插入。
我还触发了做一些事情 f.g 通知一些服务。
过程如下所示:
- 插入 table A
- 触发器在 table A
上执行
- 函数失败于
插入 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();
我想要这样的流程:
- 插入 table A
- 插入table B
- 触发器执行于 table A / 触发器在函数完成时执行
我如何才能发现事务已回滚且未执行触发器?
有什么方法可以触发函数状态吗?
是的,您可以使用 约束触发器:
CREATE CONSTRAINT TRIGGER some_trigger
AFTER INSERT ON some_table
DEFERRABLE INITIALLY DEFERRED FOR EACH ROW
EXECUTE PROCEDURE some_function();
这样的触发器将在交易结束时触发,而不是立即触发。
我有 plpgsql 函数可以对多个 table 进行多次插入。 我还触发了做一些事情 f.g 通知一些服务。
过程如下所示:
- 插入 table A
- 触发器在 table A 上执行
- 函数失败于 插入 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();
我想要这样的流程:
- 插入 table A
- 插入table B
- 触发器执行于 table A / 触发器在函数完成时执行
我如何才能发现事务已回滚且未执行触发器? 有什么方法可以触发函数状态吗?
是的,您可以使用 约束触发器:
CREATE CONSTRAINT TRIGGER some_trigger
AFTER INSERT ON some_table
DEFERRABLE INITIALLY DEFERRED FOR EACH ROW
EXECUTE PROCEDURE some_function();
这样的触发器将在交易结束时触发,而不是立即触发。