Estou tentando conceder todos os privilégios em todas as tabelas de um determinado banco de dados para um novo usuário postgres (não o proprietário). Parece que GRANT ALL PRIVILEGES ON DATABASE my_db TO new_user;
não faz isso. Depois de executar o comando com sucesso (como usuário postgres), recebo o seguinte como new_user:
$ psql -d my_db
my_db => SELECT * FROM a_table_in_my_db;
ERROR: permission denied for relation a_table_in_my_db
Duas questões:
1) O que o comando acima faz, então, se não conceder todas as permissões em todas as tabelas em my_db?
2) Qual é a maneira correta de conceder todas as permissões em todas as tabelas a um usuário? (incluindo em todas as tabelas criadas no futuro)
As respostas para suas perguntas vêm dos documentos online do PostgreSQL 8.4 .
GRANT ALL PRIVILEGES ON DATABASE
concede os privilégiosCREATE
,CONNECT
, eTEMPORARY
em um banco de dados a uma função (os usuários são chamados corretamente de funções ). Nenhum desses privilégios realmente permite que uma função leia dados de uma tabela;SELECT
privilégio na mesa é necessário para isso.Não tenho certeza se existe uma maneira "adequada" de conceder todos os privilégios em todas as tabelas a uma função. A melhor maneira de garantir que uma determinada função tenha todos os privilégios em uma tabela é garantir que a função seja proprietária da tabela. Por padrão, cada objeto recém-criado pertence à função que o criou, portanto, se você quiser que uma função tenha todos os privilégios em uma tabela, use essa função para criá-la.
O PostgreSQL 9.0 apresenta a seguinte sintaxe que é quase o que você deseja:
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO new_user;
O problema é que, se você criar tabelas em esquemas fora do esquema "público" padrão, isso
GRANT
não se aplicará a eles. Se você usar esquemas não públicos, teráGRANT
privilégios para esses esquemas separadamente.É possível configurar vários logins para atuar como proprietário do banco de dados:
CREATE ROLE dbowner NOLOGIN
ALTER DATABASE mydb OWNER TO dbowner
GRANT dbowner TO user1, user2
Agora, se user1 ou user2 fizerem login, eles terão todas as permissões em "mydb" sem nenhuma concessão adicional necessária.
No entanto, eu consideraria essa solução com cuidado. É tentador fazer com que seu aplicativo da Web use um desses logins para evitar a dor de criar concessões adicionais sempre que o esquema for atualizado, mas você está removendo uma forma de proteção muito útil dessa maneira. Use a solução acima se você realmente quiser vários "administradores", mas mantenha o padrão "conceder todos os privilégios em todas as tabelas no esquema ..." acima para o login do seu aplicativo de "uso normal".
No PostgreSQL 12 e posterior, é possível conceder todos os privilégios de uma tabela em um banco de dados a uma função/usuário/conta.
A sintaxe é:
Se você deseja concedê-lo a todas as tabelas do banco de dados , a sintaxe será:
Se você deseja conceder a todas as tabelas de um esquema no banco de dados , a sintaxe será:
Aqui está como eu fiz :
Primeiro, entrei no servidor de banco de dados Postgres:
Resultado
Em seguida, criei um usuário/função/conta de banco de dados:
Resultado
Em seguida, criei uma tabela no banco de dados postgres:
Resultado
Em seguida, concedi todos os privilégios na
candidates
mesa para a conta/usuário/funçãoalice4
Resultado
Em seguida, desconectado do banco de dados postgres e da
postgres
conta/usuário/função:Em seguida, entrei no banco de dados Postgres usando a
alice4
conta/usuário/função:Resultado
Em seguida, inseri dados na
candidates
tabela que foi criada anteriormente:Resultado
Em seguida, selecionei todos os dados da
candidates
tabela que foi criada anteriormente:Resultado
Recursos : PostgreSQL GRANT
Isso é tudo
Eu espero que isso ajude