postgresql Postgres.只读模式

2g32fytz  于 2023-05-06  发布在  PostgreSQL
关注(0)|答案(1)|浏览(330)

我有一个档案数据库。我想为它设置一个参数default_transaction_read_only = ON。我有一个删除只读模式的函数。

create or replace procedure tmp_util_archive_set_db_read_only(IN pisreadlonly boolean)
    language plpgsql
as
$$
begin
 SET default_transaction_read_only to OFF;
 if pIsReadlOnly then
  ALTER database mpbr SET default_transaction_read_only to ON;
 elseif not(pIsReadlOnly) then
  set transaction read write;
  ALTER database mpbr SET default_transaction_read_only to OFF;
 end if;
end
$$;

但是当我调用它时,我得到一个错误

cannot execute ALTER DATABASE in a read-only transaction

是否可以使用函数使数据库脱离只读模式?

do
$$
    begin
        call tmp_util_archive_set_db_read_only(pisreadlonly := false);
    end
$$;
xriantvc

xriantvc1#

不,这在函数内部是不可能的。此外,您的尝试存在一个问题,即您正在设置**default**_transaction_read_only,它只设置默认值,但不会更改当前事务。您必须设置transaction_read_only,但这将导致

ERROR:  transaction read-write mode must be set before any query

问题是调用该函数的SELECT语句已经在当前事务中开始执行,因此更改隔离已经太晚了。
你必须在函数调用之外执行:

START TRANSACTION READ WRITE;
SELECT tmp_util_archive_set_db_read_only(FALSE);
COMMIT;

相关问题