Postgresql &引用;错误:无效的交易终止“;尝试使用嵌套事务控件执行过程时

Postgresql &引用;错误:无效的交易终止“;尝试使用嵌套事务控件执行过程时,postgresql,transactions,plpgsql,commit,postgresql-11,Postgresql,Transactions,Plpgsql,Commit,Postgresql 11,根据文档(),即使将AUTOCOMMIT设置为off,PSQL也会在任何不在事务块中且本身不是BEGIN或其他事务控制命令的命令之前发出隐式BEGIN,也不是不能在事务块内执行的命令,例如VACUUM。(不幸的是,呼叫的处理方式与真空不同)。根据Shaun Thomas(),发生无效事务终止错误是因为无法从过程中关闭当前事务(在本例中是由PSQL启动的事务)。我已经尝试了与事务控制相关的所有PSQL设置,但是所有这些设置都出现了无效事务终止错误;即使PSQL处理的命令文件只包含CALL语句 这是

根据文档(),即使将
AUTOCOMMIT
设置为off,PSQL也会在任何不在事务块中且本身不是
BEGIN
或其他事务控制命令的命令之前发出隐式
BEGIN
,也不是不能在事务块内执行的命令,例如
VACUUM
。(不幸的是,
呼叫
的处理方式与
真空
不同)。根据Shaun Thomas(),发生无效事务终止错误是因为无法从过程中关闭当前事务(在本例中是由PSQL启动的事务)。我已经尝试了与事务控制相关的所有PSQL设置,但是所有这些设置都出现了无效事务终止错误;即使PSQL处理的命令文件只包含
CALL
语句

这是我调用的程序:

create or replace procedure producto$cargar_imagenes(_super$ bigint, _archivo$ character varying) as $$
declare
    _msg character varying;
    _log rastro_proceso%ROWTYPE;
begin
    perform rastro_proceso_temporal$insert(_super$);
    perform producto$cargar_imagenes$biz(_super$, _archivo$);
    if (_super$ is not null and _super$ > 0) then
        perform producto$cargar_imagenes$log(_super$, _archivo$);
    else
        perform tarea_usuario$private$update(6519204281880642486, null);
    end if;
    commit;
end;
$$ language plpgsql set search_path = public;

commit
语句中失败;如果我把它评论出来就行了

删除
SET
子句。

如果将SET子句附加到过程,则该过程无法执行事务控制语句(例如,COMMIT和ROLLBACK,具体取决于语言)

在pg11(在版本11.6中测试)中,如果在过程定义中包含“安全定义器”子句,则可能会出现相同的问题。所以我猜安全性定义符符合“SET”子句的条件

当我删除securitydefiner时,我可以在过程定义中包含一个COMMIT语句,而不会出现以下错误:COMMIT语句上的事务终止无效


不幸的是,这是一个运行时错误,而不是编译错误。

请显示您的代码。对不起,我忘了提到:请编辑问题并在那里添加代码。“psql”是PostgreSQL交互终端,不是Postgres的可接受缩写。“博士后”是。或者“pg”,如果你需要它超短。当我写PSQL的时候,我是指PSQL,我不是指Postgres。非常感谢!删除SET子句可以解决问题。为了证实您的怀疑:“安全定义程序无法执行事务控制语句”-