Concedendo acesso a todas as tabelas para um usuário


151

Eu sou novo no Postgres e estou tentando migrar nossos bancos de dados MySQL. No MySQL posso conceder SELECT, UPDATE, INSERT, e DELETEprivilégios de um usuário privilegiado baixa e permitir a esses subsídios para aplicar a todas as tabelas em um banco de dados especificado. Devo estar faltando alguma coisa no Postgres porque parece que tenho que conceder esses privilégios para cada tabela, uma de cada vez. Com muitos bancos de dados e centenas de tabelas por banco de dados, isso parece uma tarefa assustadora apenas para decolar. Além disso, quando um banco de dados está em operação, a adição de tabelas acontece com frequência suficiente para que eu não queira conceder permissões todas as vezes, a menos que seja absolutamente necessário.

Como isso é melhor realizado?

Respostas:


175

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_roleestá um papel que cria as tabelas, enquanto user_namequem recebe os privilégios. Definindo isso, você deve estar logado como some_rolemembro.

E, finalmente, você deve fazer o mesmo para as seqüências (obrigado ao PlaidFan por apontá-lo) - aqui está o USAGEprivilégio de que você precisa.


1
Obrigado, FOR some_rolefoi a parte principal que me faltava para que funcionasse nas minhas tabelas criadas mais tarde. Mas não precisava fazer login some_role, pois funcionava também se eu executasse a consulta como o postgresusuário administrador padrão .
JustAMartin

54

supondo que você deseja conceder a eles todos os privilégios - faça o seguinte:

grant all privileges on database dbname to dbuser;

onde dbnameé o nome do seu banco de dados e dbuseré o nome do usuário.


44
Isto irá adicionar os seguintes privilégios no banco de dados : CREATE, CONNECT, TEMPORARY. Sem privilégios nas mesas.
Dez13

13
Um comando semelhante para todas as tabelas seria,GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO dbuser;
Dolan Antenucci

5
Eu também achei isso útil:GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO dbuser;
Paolo

18

A concessão de todos os privilégios a todas as tabelas no banco de dados é obtida com

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA <schema_name> TO <username>;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA <schema_name> TO <username>;

15

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:

ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT, INSERT, UPDATE, DELETE ON tables TO user_name;

ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT, USAGE ON sequences TO user_name;

2
--Create User

CREATE USER my_user_test WITH LOGIN NOSUPERUSER NOCREATEDB  NOCREATEROLE    INHERIT NOREPLICATION   CONNECTION LIMIT -1 PASSWORD 'xxxxxxx';

-- Grant connect to my data base

GRANT CONNECT ON DATABASE my_db_test TO my_user_test;

-- Grant usage the schema

GRANT USAGE ON SCHEMA my_sch_test TO my_user_test ;

-- Grant all table for SELECT, INSERT, UPDATE, DELETE

GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA my_sch_test TO my_user_test;
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.