"错误:必须是角色的成员" 在 PostgreSQL 中创建模式时。

137

我正在使用超级用户账户登录,并执行以下过程:

1-> CREATE ROLE test WITH IN ROLE testroles PASSWORD 'testpasswd'
2-> CREATE SCHEMA AUTHORIZATION test

角色已正确创建,但在尝试创建模式时出现了此错误:

ERROR:  must be member of role "test"

1
请查看http://www.postgresql.org/docs/9.3/static/role-membership.html,该网址与编程有关。 - Vivek S.
我仍然遇到同样的问题,有人可以帮帮我吗? - Ultranuke
9个回答

221

在使用Amazon RDS时,我在使用CREATE DATABASE时遇到了这个问题。我认为它本质上与使用CREATE SCHEMA相同。

在使用Amazon RDS时,发出CREATE DATABASE命令的用户必须是将成为数据库所有者的角色的成员。在我的情况下,我正在使用名为root的超级用户帐户,并将创建一个名为d的数据库所有者角色o

postgres=> CREATE ROLE o;
CREATE ROLE

postgres=> CREATE DATABASE d OWNER = o;
ERROR:  must be member of role "o"

postgres=> GRANT o TO root;
GRANT ROLE

postgres=> CREATE DATABASE d OWNER = o;
CREATE DATABASE

7
同样的事情,但我发现新用户不需要具有CREATEDB权限。我创建了一个普通用户,将该用户角色授予我的管理员用户,然后使用管理员用户创建数据库,并将所有者设置为普通用户。 - Nick Spacek
2
这里有一篇简短的文章描述了RDS中这种效果的原因。https://blog.2ndquadrant.com/the-rds_superuser-role-isnt-that-super - Molomby
5
我在使用Google Cloud SQL for PostgreSQL时遇到了同样的错误,而这个答案就是解决方案,不过在创建数据库之前我运行了 GRANT o TO postgres; - Simon Watson
3
警告:在启用IAM身份验证之前,请使用REVOKEpostgres用户中删除角色。否则,在RDS中禁用IAM身份验证之前,您将无法使用用户postgres连接到数据库。 - UltimaWeapon

81

我遇到过同样的问题,它抱怨当前(主)用户您登录的用户不是您正在尝试创建模式的用户组的成员。您应该授予该角色对您的主用户的访问权限,这将允许您无误地创建模式:

GRANT <role> TO <master_user>;

24

您是否正在使用RDS?因为当我登录作为他们为您创建的“超级用户”时,我也遇到了同样的问题。我能够解决这个问题的方式是创建一个新的组角色,该组角色包括我的超级用户和拥有模式的用户。因此,对于您来说,这意味着将您的超级用户和测试用户添加到一个新的角色组中:

CREATE ROLE users NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;
GRANT megausers TO testroles;
GRANT test TO testroles;

现在您应该能够创建您的模式


1
这有点混乱,但我最终使用它弄清楚了发生了什么。请参见我的回答:https://dev59.com/LF8d5IYBdhLWcg3wkS0V#34898033 - David Jones

23

我也遇到了RDS的这个问题。

解决方法:

以超级用户身份登录

psql --host=xxxxxxx.rds.amazonaws.com --port=5432 --username=RDS_SUPERUSER_NAME --password --dbname=postgres

创建用户

CREATE USER newuser WITH CREATEDB PASSWORD 'password';

登出

\q

newuser 身份登录

psql --host=xxxxxxx.rds.amazonaws.com --port=5432 --username=newuser --password --dbname=postgres

创建你的数据库/模式

CREATE SCHEMA/DATABASE ....

10

我们难道不只是需要授予管理员用户服务角色的成员资格吗?

create role service_role with password 'some_password';
create database service_db with owner service_role;
ERROR:  must be member of role "service_role"
grant admin_user service_role;
GRANT ROLE
create database service_db with owner service_role;
CREATE DATABASE

4
在Postgres 9.0及以上版本中,授权包括"TO":GRANT service_role TO admin_user; - Grengas

4
我在RDS上也遇到了这个问题。我以root用户身份登录,创建了一个名为myappuser的角色,然后尝试创建一个名为superduper的模式,其所有者是myappuser
我找到了一个有效的解决方案。创建myappuser角色,并确保该角色至少具有创建数据库的权限(该特权称为CREATEDB)。创建myappuser角色后,我以myappuser用户身份登录数据库,并创建了superduper模式,其用户为myappuser。这样做没有任何问题。

3

我通过使用postgres用户登录(然后应用我的更改,即在我的情况下更改所有权)来解决了这个问题:

sudo -u postgres psql
ALTER DATABASE my_database OWNER TO new_user;

1
我刚刚在使用Amazon RDS时遇到了这个问题。
很多答案已经正确,但您也可以更改角色。
以下是我的实现: psql -h ${PGHOST} -p ${PGPORT:-5432} -U ${PGUSER:-postgres} -c "ALTER USER renderer WITH CREATEDB PASSWORD '$RENDERPASSWORD'" 因此,在更改密码的同时,我还将CREATEDB角色权限添加到了该角色。

0

我曾经遇到过同样的问题。为了解决这个问题,我使用新创建的角色登录并创建了数据库。 不知何故,在RDS Postgres中授权无法正常工作。


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