PostgreSQL查询以查找数据库是否处于只读模式

3

我刚接触Postgres数据库。在MySQL中,我们可以通过触发以下查询来检查数据库是否处于只读模式。

SELECT @@global.read_only

同样,有人能帮我提供在Postgres中执行相同操作的查询吗?我尝试了一些东西,如下所示:

SELECT schemaname||'.'||tablename FROM pg_tables
WHERE
  has_table_privilege ( 'postgres', schemaname||'.'||tablename, 'select' )
  AND schemaname NOT IN ( 'pg_catalog','information_schema');

但是它列出的结果如下,这不是我期望的。
         ?column?                
----------------------------------------
 public.schema_migrations
 public.credential_methods
 public.notifications
 public.site_defaults
 public.apis
 public.client_applications
 public.api_groups
 public.operations
 public.client_application_labels
 public.client_application_label_values
 public.roles
 public.users
 public.sdm_user_roles
 public.permissions_roles
 public.keys
 public.o_two_access_tokens
 public.settings
 public.sdm_users
 public.permissions
 public.audits
 public.oauth_requesttokens
 public.oauth_access_tokens
 public.oauth_verifiers
 public.logged_exceptions
 public.api_call_details
 public.api_access_roles
 public.api_access_users
 public.login_attempts
 public.system_scopes
 public.keys_system_scopes
 public.o_two_auth_codes
 public.o_two_refresh_tokens
 public.service_profiles
 public.error_traces

我也尝试了"\du",但这只在终端中有效,而不是在Ruby文件中。
query=ActiveRecord::Base.connection.execute("\du;")

ActiveRecord::StatementInvalid: PGError: 错误:在“du”附近有语法错误 第1行:du;

谢谢, Rafiu


反斜杠命令(例如\du)不是SQL的一部分,而是用于psql命令行前端的终端监视器命令。对于你的原始问题:我不知道答案。只需尝试插入或更新,并处理错误即可。 - undefined
1
我认为在PostgreSQL中没有“只读”数据库的概念。另外:但它正在列出我不期望的东西。所以你应该展示给我们你得到了什么以及你期望得到什么。 - user330315
嘿,感谢您的回复。当我触发查询时,我得到了以下输出。 - undefined
你会期待什么呢?输出结果是所有用户postgres拥有select权限的表格。由于postgres用户通常是“超级用户”,所以这个输出结果并不奇怪。 - user330315
2个回答

8
如果你有一个多节点实例集群,并且启用了热备机制,SELECT pg_is_in_recovery()的输出可以告诉你该集群是否处于只读模式。

4
您可能需要使用has_*_privilege()系列函数来获取与相关表和相关权限有关的信息。请参见此处。除此之外,我不确定PostgreSQL是否有只读模式的概念。
嗯,在只读事务中还有show transaction_read_only,但那似乎不是您所要求的。并且我不认为事务的只读状态会影响用户的权限。
我不确定您对查询有什么期望,但如果您想要一个布尔值,比如是否在任何地方都有访问权限,您可以使用count(*)!=0(并且可能不使用select)。

我的数据库管理员告诉我,PostgreSQL确实有一个只读模式。在我们的组织中,我们的PostgreSQL集群配置了一个A服务器(读写)和一个处于"热备份"模式的只读B服务器。对A所做的更改会复制到B。B服务器接受连接,但如果尝试进行更改,则会出现错误。文档中指出:“所有这些连接都是严格只读的;甚至不能写入临时表。”为了确定是否意外连接到B服务器,我们的数据库管理员建议使用show transaction_read_only命令。 - undefined
@DavidCostanzo,我觉得你的DBA是对的,虽然我对Postgres的复制和其他东西有点落后,但我也觉得,我对2012年情人节的回答还是相当正确的 ;-)如果我知道更多,我会更新它,但我需要先让自己跟上最新进展,所以希望大家阅读这些评论并自己完成作业 ;-) - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接