如何在只读事务中不执行INSERT



Postgres服务器处于热备用模式。使用异步流二进制复制。

类似的命令

INSERT INTO logfile (logdate) values (current_date)

导致错误

无法在只读事务中执行INSERT。

也许应该改为

INSERT INTO logfile (logdate) 
SELECT current_date
WHERE   ???

应该使用什么样的条件?它应该从Postgres 9.0开始工作如果不能直接使用where子句,那么可以在where中使用一些plpgsql函数。

也许

show transaction_read_only

应该捕获结果或者可以使用某些函数。

或者,应用程序可以在启动时确定数据库是否为只读。应显示用于此操作的transaction_read_only结果。

在备用服务器上运行INSERT在纯(非过程(SQL中是不可能的,因为当服务器处于备用模式时,在执行之前,所有数据修改查询都会在计划阶段被拒绝。

PL/PgSQL中的条件语句是可能的。

DO $code$
BEGIN
IF NOT pg_is_in_recovery() THEN
INSERT INTO logfile (logdate) VALUES (current_date);
END IF;
END;
$code$;

然而,可能不建议这样做——通常最好(在应用程序代码中(测试pg_is_in_recovery()一次,然后采取相应的行动。

我使用pg_is_in_recovery()系统函数而不是transaction_read_onlyGUC,因为这不是完全一样的东西。但如果你喜欢,请使用:

SELECT current_setting('transaction_read_only')::bool

更多信息:DO命令,PL/PgSQL中的条件,系统信息函数。

最新更新