„BŁĄD: musi być członkiem roli” Podczas tworzenia schematu w PostgreSQL

88

Jestem zalogowany na konto superużytkownika i oto proces, który wykonuję:

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

Rola została utworzona poprawnie, ale podczas próby utworzenia schematu pojawia się ten błąd:

ERROR:  must be member of role "test"

Z góry dziękuję!

Ultranuke
źródło
po prostu przejdź przez postgresql.org/docs/9.3/static/role-membership.html
Vivek S.
Nadal mam ten sam problem, czy ktoś może mi pomóc?
Ultranuke

Odpowiedzi:

128

Napotkałem ten problem podczas korzystania CREATE DATABASEz Amazon RDS. Myślę, że to zasadniczo to samo, co używanie CREATE SCHEMA.

W przypadku korzystania z usługi Amazon RDS użytkownik wystawiający CREATE DATABASEmusi być członkiem roli, która będzie właścicielem bazy danych. W moim przypadku konto superużytkownika, którego używam, jest wywoływane rooti mam zamiar utworzyć rolę, októra będzie właścicielem bazy danych 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
David Jones
źródło
3
To samo, ale odkryłem, że nowy użytkownik nie musi mieć uprawnienia CREATEDB. Utworzyłem zwykłego użytkownika, przyznałem tę rolę mojemu administratorowi, a następnie utworzyłem bazę danych przy użyciu administratora z właścicielem ustawionym na zwykłego użytkownika.
Nick Spacek
Tutaj jest krótki opis opisujący przyczynę tego efektu w RDS. Blog.2ndquadrant.com/the-rds_superuser-role-isnt-that-super
Molomby
2
Miałem ten sam błąd w Google Cloud SQL dla PostgreSQL i ta odpowiedź była rozwiązaniem, z wyjątkiem tego, że uruchomiłem GRANT o TO postgres;przed utworzeniem bazy danych.
Simon Watson
38

Natknąłem się na ten sam problem, narzeka, że ​​obecny (główny) użytkownik, z którym jesteś zalogowany, nie jest członkiem grupy użytkowników, dla której próbujesz utworzyć schemat. Powinieneś przyznać dostęp do roli swojemu głównemu użytkownikowi, co pozwoli Ci bezbłędnie stworzyć SCHEMAT:

GRANT <role> TO <master_user>;
James Ching
źródło
24

Czy używasz RDS? Ponieważ mam ten sam problem, gdy loguję się jako „superużytkownik”, którego dla Ciebie utworzyli. Sposób, w jaki mogłem to naprawić, polegał na utworzeniu nowej roli grupowej obejmującej mojego superużytkownika i użytkownika, który był właścicielem schematu. Dla Ciebie oznaczałoby to więc dodanie superużytkownika i użytkownika testowego do nowej grupy ról:

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

Teraz powinieneś być w stanie stworzyć swoją schmea

bioniceraph
źródło
1
Jest to trochę zagmatwane, ale użyłem tego, aby ostatecznie ustalić, co się dzieje. Zobacz moją odpowiedź: stackoverflow.com/a/34898033/242457
David Jones
17

Miałem ten problem z RDS.

Aby to rozwiązać:

Zaloguj się jako superużytkownik

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

Utwórz użytkownika

CREATE USER newuser WITH CREATEDB PASSWORD 'password';

Wyloguj

\q

Zaloguj się jako newuser

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

Utwórz swoją bazę danych / schemat

CREATE SCHEMA/DATABASE ....
Rafael Oliveira
źródło
8

Czy nie musimy po prostu przyznać użytkownikowi administracyjnemu członkostwa w roli usługi?

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
jorfus
źródło
4
W Postgres 9.0 i nowszych przyznanie obejmuje „DO”:GRANT service_role TO admin_user;
Grengas
5

Napotkałem ten problem również na RDS. Zalogowałem się jako rootużytkownik, utworzyłem rolę o nazwie, myappusera następnie próbowałem utworzyć schemat o nazwie, superduperktórego właścicielem jest myappuser.

Znalazłem rozwiązanie, które działa. Utwórz myappuserrolę i upewnij się, że ta rola ma przynajmniej uprawnienia do tworzenia baz danych (to uprawnienie nazywa się CREATEDB). Po utworzeniu myappuserroli zalogowałem się do bazy danych jako myappuseri utworzyłem superduperschemat, którego użytkownikiem jest myappuser. To działało bez żadnych problemów.

Krystian Cybulski
źródło
0

Miałem ten sam problem. Aby rozwiązać ten problem, zalogowałem się w nowo utworzonej roli i utworzyłem bazę danych. W jakiś sposób grant nie działa w RDS Postgres.

Sid
źródło
0

Właśnie natknąłem się na to używając Amazon RDS.

Wiele odpowiedzi jest już poprawnych, ale możesz też po prostu zmienić rolę.

Oto moja realizacja

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

Więc zmieniając hasło, dodam również uprawnienie roli CREATEDB do roli.

sprut
źródło
0

Naprawiłem to, logując się jako postgresużytkownik (a następnie wprowadzając zmiany, czyli zmianę właściciela w moim przypadku):

sudo -u postgres psql
ALTER DATABASE my_database OWNER TO new_user;
DevonDahon
źródło