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_only
GUC,因为这不是完全一样的东西。但如果你喜欢,请使用:
SELECT current_setting('transaction_read_only')::bool
更多信息:DO命令,PL/PgSQL中的条件,系统信息函数。