1

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

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

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;

但没有奏效。

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

谢谢

4

1 回答 1

0

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

但是,我认为您也应该能够 new_user首先一样进行重新分配GRANT old_user TO new_user- 然后唯一的技巧是建立连接 as new_user,这可能需要GRANT CONNECT ON DATABASE x TO new_user

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

于 2020-06-24T14:50:20.143 回答