Postgresql 错误:无法建立连接

Posted

技术标签:

【中文标题】Postgresql 错误:无法建立连接【英文标题】:Postgresql ERROR: could not establish connection 【发布时间】:2020-08-28 22:21:51 【问题描述】:

刚接触 RDS PostgreSQL 并尝试创建一个新用户来接管以前的用户。

1:因为新用户不是超级用户,所以我必须在删除之前按照these instructions重新分配之前的用户对象,如下:

CREATE ROLE TempUser WITH PASSWORD 'temppass' LOGIN;

2:让 TempUser 成为新老用户的一部分

GRANT OldUser TO TempUser;
GRANT NewUser TO TempUser;

3:为每个数据库(循环)重新分配 OldUser 对象和 Drop Owned:

SELECT DBLINK('dbname=some_db user=TempUser password=temppass host=localhost', 'REASSIGN OWNED BY OldUser TO NewUser; DROP OWNED BY OldUser;');

第 3 步是错误发生的地方。

ERROR: could not establish connection

当我在函数中运行上述代码时会发生错误。但是当我手动执行这些步骤时,它可以工作。 该函数位于当前服务器的 Db 中。

当我手动运行并且它工作时,我在 MasterUser(服务器的创建者)的上下文中运行。

但是,如果我尝试在上面的 dblink 中使用 masteruser 凭据,在函数中运行时,我会收到此错误:

permission denied to reassign objects

我还尝试向 TempUser 授予以下权限:

GRANT CONNECT ON DATABASE some_db TO TempUser;     
GRANT ALL PRIVILEGES ON DATABASE some_db TO TempUser;

但是没有用。

对此的任何帮助表示赞赏。

谢谢

【问题讨论】:

【参考方案1】:

在没有超级用户帐户的情况下使用REASSIGN 时存在一些非常不直观的权限要求(如在 RDS on Cloud SQL 上)。我很惊讶它实际上对您使用 masteruser 有用,除非 masteruser 以某种方式是超级用户?基本上,为了重新分配为主用户,我认为你必须 GRANT old_user TO masteruserGRANT new_user TO masteruser (即使 masteruser 是创建它们的人 - 如果他们碰巧这可能需要撤销他们两个的 masteruser masteruser 的成员 - 请参阅相关答案,例如:https://***.com/a/62557497/79079)

但是,我认为您也应该能够重新分配 as new_user,如果您首先使用 GRANT old_user TO new_user - 那么唯一的技巧就是以 new_user 建立连接,这可能需要GRANT CONNECT ON DATABASE x TO new_user

不确定这是否是完整的答案,但希望它可以帮助您朝着正确的方向前进!

【讨论】:

以上是关于Postgresql 错误:无法建立连接的主要内容,如果未能解决你的问题,请参考以下文章

PostGIS 版本阻止了 Amazon RDS 上的 PostgreSQL 升级

连接多台服务器 PostgreSQL R

PostgreSQL 错误的所有权

春季启动中的postgresql错误

Docker:Springboot 容器无法连接到 PostgreSql 容器连接错误

TestContainers 和错误:“无法验证连接 org.postgresql.jdbc.PgConnection”(为所有测试类提升单个容器)