«ОШИБКА: должен быть членом роли» при создании схемы в PostgreSQL

88

Я вошел в систему с учетной записью суперпользователя, и вот что я делаю:

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

Роль создана правильно, но я получаю эту ошибку при попытке создать схему:

ERROR:  must be member of role "test"

Заранее спасибо!

Ultranuke
источник
просто пройдите postgresql.org/docs/9.3/static/role-membership.html
Вивек С.
У меня все еще та же проблема, кто-нибудь может мне помочь?
Ultranuke

Ответы:

128

Я столкнулся с этой проблемой при использовании CREATE DATABASEAmazon 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. Я создал обычного пользователя, предоставил эту роль моему пользователю с правами администратора, а затем создал базу данных, используя пользователя с правами администратора, с владельцем, установленным на обычного пользователя.
Ник Спейсек
Здесь есть краткая запись, описывающая причину этого эффекта на RDS .. blog.2ndquadrant.com/the-rds_superuser-role-isnt-that-super
Molomby
2
У меня была такая же ошибка в Google Cloud SQL для PostgreSQL, и этот ответ был решением, за исключением того, что я запускал 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;

Теперь вы сможете создать свою шмею

бионикасерафим
источник
1
Это немного сбивает с толку, но я использовал это, чтобы в конечном итоге понять, что происходит. См. Мой ответ: stackoverflow.com/a/34898033/242457
Дэвид Джонс,
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

Разве мы не должны просто предоставить членство администратора в роли службы?

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 и выше предоставление включает «ТО»: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;
ДевонДахон
источник