Primeiro, você precisa se conectar ao banco de dados para executar as consultas. Isso pode ser alcançado por
REVOKE CONNECT ON DATABASE your_database FROM PUBLIC;
GRANT CONNECT
ON DATABASE database_name
TO user_name;
O REVOKE
é necessário porque
A palavra-chave PUBLIC indica que os privilégios devem ser concedidos a todas as funções, incluindo aquelas que podem ser criadas posteriormente. PUBLIC pode ser pensado como um grupo definido implicitamente que sempre inclui todas as funções. Qualquer função em particular terá a soma dos privilégios concedidos diretamente a ela, privilégios concedidos a qualquer função da qual atualmente seja membro e privilégios concedidos a PUBLIC.
Se você realmente deseja restringir seu usuário a instruções DML, tem um pouco mais a fazer:
REVOKE ALL
ON ALL TABLES IN SCHEMA public
FROM PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE
ON ALL TABLES IN SCHEMA public
TO user_name;
Eles assumem que você terá apenas um esquema (que é chamado de 'público' por padrão).
Como Jack Douglas apontou, o acima mencionado apenas concede os privilégios para as tabelas já existentes . Para conseguir o mesmo para tabelas futuras, é necessário definir privilégios padrão :
ALTER DEFAULT PRIVILEGES
FOR ROLE some_role -- Alternatively "FOR USER"
IN SCHEMA public
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO user_name;
Aqui some_role
está um papel que cria as tabelas, enquanto user_name
quem recebe os privilégios. Definindo isso, você deve estar logado como some_role
membro.
E, finalmente, você deve fazer o mesmo para as seqüências (obrigado ao PlaidFan por apontá-lo) - aqui está o USAGE
privilégio de que você precisa.
FOR some_role
foi a parte principal que me faltava para que funcionasse nas minhas tabelas criadas mais tarde. Mas não precisava fazer loginsome_role
, pois funcionava também se eu executasse a consulta como opostgres
usuário administrador padrão .supondo que você deseja conceder a eles todos os privilégios - faça o seguinte:
onde
dbname
é o nome do seu banco de dados edbuser
é o nome do usuário.fonte
CREATE, CONNECT, TEMPORARY
. Sem privilégios nas mesas.GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO dbuser;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO dbuser;
A concessão de todos os privilégios a todas as tabelas no banco de dados é obtida com
fonte
Pode ser que eu estivesse fazendo algo errado aqui, pois sou muito novo no PostgreSQL. Mas isso só resolveu a primeira parte do problema para mim - definir os privilégios em todas as tabelas existentes.
Para que as permissões sejam definidas corretamente para o meu usuário em novas tabelas criadas, preciso definir permissões padrão para o usuário:
fonte
fonte