加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

处理PostgreSQL Transactoin in Read Only Mode一例

发布时间:2020-12-13 16:55:03 所属栏目:百科 来源:网络整理
导读:问题描述: 今天同事使用桌面直接连接到ArcGIS Data Store中的PostgreSQL空间数据库后,使用桌面工具删除其中的任何一个图层,都会报如下错误: 解决过程: 从错误上看应该说连接的session处于只读模式,因此不让删除表(在PostgreSQL中DDL操作也可以在事务

问题描述:
今天同事使用桌面直接连接到ArcGIS Data Store中的PostgreSQL空间数据库后,使用桌面工具删除其中的任何一个图层,都会报如下错误:

解决过程:
从错误上看应该说连接的session处于只读模式,因此不让删除表(在PostgreSQL中DDL操作也可以在事务中,这点跟oracle不一样),使用ArcGIS Data Store打包的PostgreSQL客户端连接上去,看看是否也报同样的错误。

db_2d91u=> select current_user;
-[ RECORD 1 ]+----------
current_user | hsu_nq545


db_2d91u=> drop table 一级河流4l;
错误:  不能在一个只读模式的事务中执行DROP TABLE

依然报同样的错误,也就是所有的客户端连接上后都是只读模式。

因此判断应该是PostgreSQL的default_transaction_read_only模式值为on了,使用工具进行查看如下:

db_2d91u=> show default_transaction_read_only;
-[ RECORD 1 ]-----------------+---
default_transaction_read_only | on


db_2d91u=> select * from pg_settings where name='default_transaction_read_only';

-[ RECORD 1 ]------------------------------------------------------
name       | default_transaction_read_only
setting    | on
unit       |
category   | Client Connection Defaults / Statement Behavior
short_desc | Sets the default read-only status of new transactions.
extra_desc |
context    | user
vartype    | bool
source     | database
min_val    |
max_val    |
enumvals   |
boot_val   | off
reset_val  | on
sourcefile |
sourceline |
db_2d91u=# select * from pg_db_role_setting;
-[ RECORD 1 ]-------------------------------------------------------------------
-------
setdatabase | 12029
setrole     | 0
setconfig   | {"search_path="$user",public,sde"}
-[ RECORD 2 ]-------------------------------------------------------------------
-------
setdatabase | 17418
setrole     | 0
setconfig   | {"search_path="$user",sde",default_transaction_read_onl
y=true}

db_2d91u=# select datname from pg_database where oid=17418;
-[ RECORD 1 ]-----
datname | db_2d91u

从结果上看该参数生效的值的确是on,导致整个系统处于只读模式。
继续查看postgresql.conf中的default_transaction_read_only值,发现其为off。这跟boot_val | off
一致了,说明在system级别上设置的off.

source | database和pg_db_role_setting中的查询结果,说明在数据库级别上设置了其值为on,并覆盖了system上的设置。

需要将database级别上的参数修改成off。

db_2d91u=# alter database db_2d91u set default_transaction_read_only=off;
错误:  不能在一个只读模式的事务中执行ALTER DATABASE db_2d91u=# set default_transaction_read_only=off;
SET db_2d91u=# alter database db_2d91u set default_transaction_read_only=off;
ALTER DATABASE db_2d91u=# select * from pg_settings where name='default_transaction_read_only';

-[ RECORD 1 ]------------------------------------------------------
name       | default_transaction_read_only
setting    | off
unit       |
category   | Client Connection Defaults / Statement Behavior
short_desc | Sets the default read-only status of new transactions.
extra_desc |
context    | user
vartype    | bool
source     | database
min_val    |
max_val    |
enumvals   |
boot_val   | off
reset_val  | off
sourcefile |
sourceline |

使用桌面重新连接后,发现可以成功删除图层。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读