Estou um pouco confuso sobre a definição de permissões no PostgreSQL.
Eu tenho esses papéis:
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------+-----------
admin | Superuser, Create role, Create DB, Replication | {}
meltemi | Create role, Create DB | {rails}
rails | Create DB, Cannot login | {}
myapp | | {rails}
e bancos de dados:
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
---------------------+--------+----------+-------------+-------------+-------------------
myapp_production | rails | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
...
O usuário myapp
não tem nenhum problema ao consultar o myapp_production
banco de dados, adicionando e excluindo registros. Eu gostaria de meltemi
poder também consultar o mesmo banco de dados. Então, criei uma função rails
que é proprietária do banco de dados e composta por ambos meltemi
e myapp
membros rails
. Mas ainda recebo permission denied for relation
erros. Meltemi
pode visualizar o esquema, mas não pode consultar o banco de dados.
Acabei de notar (com \dt
comando) que myapp
é o proprietário das tabelas:
List of relations
Schema | Name | Type | Owner
--------+-------------------+-------+-------
public | events | table | myapp
public | schema_migrations | table | myapp
...
public | users | table | myapp
...
As tabelas foram criadas por meio de um ORM (migrações do ActiveRecord do Rails).
Eu sei que a autorização é muito diferente no PostgreSQL (em oposição ao MySQL e outros que eu usei). Como devo configurar meu banco de dados para que diferentes usuários possam acessá-lo. Alguns devem ser capazes de CRUD, mas outros só podem ler, etc ...
Obrigado por qualquer ajuda. Desculpe, sei que esta é uma pergunta muito básica, mas não consegui encontrar a resposta.
fonte
myapp
vez derails
acima? Porquemyapp
possui as tabelas (nunca especifiquei isso, a migração deve ter). De qualquer forma, seria sorta faz sentido se eu renomeadomyapp
paramyapp_group
e, em seguida, fez um novo usuáriomyapp
que o aplicativo trilhos usaria para se conectar ao DB. Makemyapp
e existentemeltemi
, ambos membros damyapp_group
função. Mas o que acontece quando eu executo a próxima migração. não será possuído pormyapp
recriar o problema novamente?!?roles
(desde a versão 8.1). Os termosuser
egroup
são mantidos por razões históricas e compatibilidade. Basicamente, um "grupo" é uma função sem o privilégio de login. Você pode concedermyapp
ameltemi
mesmo semyapp
é apenas mais um "usuário". Comece lendo o manual aqui .roles
vsgroups
vsusers
separação no Postgres, pelo menos eu acho que sim. Desculpe por usar a terminologia errada (e confusa) acima. Mas ainda não entendo como configurar meu banco de dados, de modo que uma função sem login OWNS o banco de dados e duas funções de loginmyapp
emeltemi
ambas possam ter acesso total. Uma dessas funçõesmyapp
estará executando migrações do Rails que, inevitavelmente?, Criarão novas tabelas que são mais uma vez pertencentes amyapp
um usuário de logon. Devo apenas fazermeltemi
um 'membro'myapp
e terminar com isso? Mas isso parece esquisito ... não ?!myapp
detém parameltemi
, em seguida, que seria a coisa certa a fazer. Se você desejameltemi
obter apenas um subconjunto de privilégios, isso não aconteceria. Em seguida, crie uma função de grupo para manter o conjunto de privilégios e conceder isso ameltemi
. Você provavelmente estará interessado nesta questão relacionada ao SO . Eu respondi explicandoDEFAULT PRIVILEGES
SET ROLE
comando ao início de suas migrações e umRESET ROLE
ao final, mas eu não confiaria que o Rails executasse tudo perfeitamente em ordem. Erwin está certo; nesse caso, a melhor solução alternativa será paraGRANT
os trilhos do usuário que pertencem ao outro usuário, usando o 1º usuário como um grupo para o segundo.