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

问题描述 投票:0回答:1

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结果。

postgresql plpgsql database-replication
1个回答
0
投票

使用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_only GUC,因为它不完全相同。但是,如果您愿意,请使用:

SELECT current_setting('transaction_read_only')::bool

更多信息:DO commandconditionals in PL/PgSQLsystem information functions

© www.soinside.com 2019 - 2024. All rights reserved.