在PostgreSQL中创建架构时出现“错误:必须是角色成员”


87

我使用超级用户帐户登录,这是我正在执行的过程:

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

角色已正确创建,但是在尝试创建架构时出现此错误:

ERROR:  must be member of role "test"

提前致谢!



我仍然遇到同样的问题,任何人都可以帮助我吗?
Ultranuke

Answers:


127

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

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

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

3
同样,但是我发现新用户不需要CREATEDB权限。我创建了一个普通用户,将该用户角色授予了admin用户,然后使用admin用户(所有者设置为该普通用户)创建了数据库。
尼克·史派克

这里有一篇简短的文章,描述了对RDS产生这种影响的原因。.blog.2ndquadrant.com/the
rds_superuser-

2
我在PostgreSQL的Google Cloud SQL上遇到了相同的错误,这个答案是解决方案,除了GRANT o TO postgres;在创建数据库之前运行过。
西蒙·沃森

38

我遇到了同样的问题,它抱怨您登录时使用的当前(主)用户不是您尝试为其创建架构的用户组的成员。您应该向主用户授予角色访问权限,这将使您创建SCHEMA时没有错误:

GRANT <role> TO <master_user>;

24

您正在使用RDS吗?因为当我以他们为您创建的“超级用户”身份登录时遇到相同的问题。我能够解决此问题的方法是创建一个新的组角色,其中包括我的超级用户和拥有该模式的用户。因此,对您而言,这意味着将您的超级用户和测试用户添加到新的角色组中:

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

现在您应该可以创建您的schmea


1
这有点困惑,但是我确实使用它来最终解决了所发生的事情。看到我的回应:stackoverflow.com/a/34898033/242457
David Jones

17

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 ....

8

我们不是只需要将admin用户成员身份授予服务角色吗?

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

5

我在RDS上也遇到了这个问题。我以root用户身份登录,创建了一个名为的角色myappuser,然后尝试创建一个superduper其所有者为的架构myappuser

我找到了可行的解决方案。创建myappuser角色,并确保该角色至少具有创建数据库的权限(该特权称为CREATEDB)。创建myappuser角色后,我以身份登录数据库myappuser并创建了superduper用户为的架构myappuser。这项工作没有任何问题。


0

我面临着同样的问题。为了解决这个问题,我以新创建的角色登录并创建了数据库。不知何故,授予在RDS Postgres中不起作用。


0

我只是使用Amazon RDS遇到了这个问题。

许多答案已经是正确的,但是您也可以更改角色。

这是我的实现

psql -h ${PGHOST} -p ${PGPORT:-5432} -U ${PGUSER:-postgres} -c "ALTER USER renderer WITH CREATEDB PASSWORD '$RENDERPASSWORD'"

因此,在更改密码的同时,我还向角色添加了CREATEDB角色权限。


0

我通过用postgres用户登录来修复它(然后应用我的更改,在我的情况下这是更改所有权):

sudo -u postgres psql
ALTER DATABASE my_database OWNER TO new_user;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.