“ERROR: must be member of role” Ao criar o esquema no PostgreSQL

87

Estou conectado com uma conta de superusuário e este é o processo que estou fazendo:

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

A função foi criada corretamente, mas estou recebendo este erro ao tentar criar o esquema:

ERROR:  must be member of role "test"

Desde já, obrigado!

Ultranuke
fonte
Continuo com o mesmo problema, alguém pode me ajudar?
Ultranuke

Respostas:

127

Eu tive esse problema ao usar CREATE DATABASEno Amazon RDS. Acho que é essencialmente o mesmo que usar CREATE SCHEMA.

Ao usar o Amazon RDS, o usuário que emite o CREATE DATABASEdeve ser um membro da função que será o proprietário do banco de dados. No meu caso, a conta de superusuário que estou usando é chamada roote vou criar uma função oque terá um banco de dados 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
fonte
3
Mesma coisa, mas descobri que o novo usuário não precisava ter a permissão CREATEDB. Criei um usuário normal, conceda essa função de usuário ao meu usuário administrador e, em seguida, crie o banco de dados usando o usuário administrador com o proprietário definido como usuário normal.
Nick Spacek
Há um pequeno artigo que descreve a causa desse efeito no RDS aqui .. blog.2ndquadrant.com/the-rds_superuser-role-isnt-that-super
Molomby
2
Eu tive esse mesmo erro no Google Cloud SQL para PostgreSQL e essa resposta foi a solução, exceto que executei GRANT o TO postgres;antes de criar o banco de dados.
Simon Watson
38

Eu me deparei com o mesmo problema, ele está reclamando que o usuário atual (mestre) com o qual você está conectado não é membro do grupo de usuários para o qual você está tentando criar o esquema. Você deve conceder o acesso de função ao seu usuário mestre e isso permitirá que você crie o SCHEMA sem erros:

GRANT <role> TO <master_user>;
James Ching
fonte
24

Você está usando RDS? Porque tenho o mesmo problema quando faço login como o "superusuário" que eles criaram para você. A maneira que consegui corrigir isso foi criar uma nova função de grupo que incluía meu superusuário e o usuário dono do esquema. Então, para você, isso significaria adicionar seu superusuário e usuário de teste a um novo grupo de funções:

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

Agora você deve ser capaz de criar seu schmea

bionicseraph
fonte
1
Isso é um pouco confuso, mas usei isso para descobrir o que estava acontecendo. Veja minha resposta: stackoverflow.com/a/34898033/242457
David Jones
17

Tive esse problema com RDS também.

Para resolver:

Faça login como superusuário

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

Crie o usuário

CREATE USER newuser WITH CREATEDB PASSWORD 'password';

Sair

\q

Entrar como newuser

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

Crie seu banco de dados / esquema

CREATE SCHEMA/DATABASE ....
Rafael Oliveira
fonte
8

Não precisamos apenas conceder ao usuário administrador a associação à função de serviço?

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
fonte
4
No Postgres 9.0 e superior, a concessão inclui "PARA":GRANT service_role TO admin_user;
Grengas de
5

Também encontrei esse problema no RDS. Efetuei login como o rootusuário, criei uma função chamada myappusere tentei criar um esquema chamado superdupercujo proprietário é myappuser.

Eu encontrei uma solução que funciona. Crie a myappuserfunção e certifique-se de que essa função tenha pelo menos permissão para criar bancos de dados (o privilégio é chamado CREATEDB). Depois de criar a myappuserfunção, eu loguei no banco de dados como myappusere criei o superduperesquema de quem é o usuário myappuser. Isso funcionou sem problemas.

Krystian Cybulski
fonte
0

Eu estava enfrentando o mesmo problema. Para resolver isso, efetuei login com a função recém-criada e criei o banco de dados. De alguma forma, conceder não funciona no RDS Postgres.

Sid
fonte
0

Acabei de encontrar isso usando o Amazon RDS.

Muitas das respostas já estão corretas, mas você também pode apenas alterar a função.

Aqui estava minha implementação

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

Portanto, ao alterar a senha, também estou adicionando a permissão de função CREATEDB à função.

sprut
fonte
0

Eu consertei fazendo login com o postgresusuário (e depois apliquei minhas alterações, que no meu caso era mudar de propriedade):

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