Postgresql: o que o GRANT ALL PRIVILEGES ON DATABASE faz?


60

Estou tentando conceder todos os privilégios em todas as tabelas de um determinado banco de dados para um novo usuário do 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 êxito (como usuário do 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, se não concede 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? (inclusive em todas as tabelas criadas no futuro)

Respostas:


80

As respostas para suas perguntas vêm dos documentos on - line do PostgreSQL 8.4 .

  1. GRANT ALL PRIVILEGES ON DATABASEconcede o CREATE, CONNECT, e TEMPORARYprivilégios em um banco de dados para um papel (usuários estão devidamente referidos como papéis ). Na verdade, nenhum desses privilégios permite que uma função leia dados de uma tabela; SELECTprivilégio na mesa é necessário para isso.

  2. 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 a proprietária da tabela. Por padrão, cada objeto recém-criado pertence à função que o criou; portanto, se você deseja que uma função tenha todos os privilégios em uma tabela, use essa função para criá-lo.

    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 GRANTnão se aplicará a elas. Se você usar esquemas não públicos, terá GRANTos privilégios para esses esquemas separadamente.


11
um banco de dados pode ter vários proprietários? Se sim, como adicionar outro proprietário?
rz.

não, eu não acho que um banco de dados pode ter mais de um proprietário, você poderia dar-lhes todas as gravações de um proprietário embora
hellomynameisjoel

15
não esqueça que você deve fazer o mesmo nas seqüências: GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO your_user;ou não poderá inserir nenhum registro.

Mesmo que não funcione, tente o seguinte: = CONCEDE TODOS OS PRIVILÉGIOS EM TODAS AS TABELAS DO ESQUEMA public TO your_user;
26415 Kaustubh

10

É possível configurar vários logins para atuar como o proprietário do banco de dados:

  • Crie uma função "nologin" para atuar como proprietário: create role dbowner nologin
  • Altere o proprietário do seu banco de dados para: alter database mydb owner dbowner
  • Conceda todos os seus logins a essa nova função: grant dbowner to user1, user2

Agora, se o usuário1 ou o usuário2 fizerem login, eles terão todas as permissões no "mydb", sem a necessidade de outras concessões.

No entanto, eu consideraria esta solução com cuidado. É tentador fazer com que seu aplicativo Web use um desses logons para evitar a criação de concessões adicionais sempre que o esquema for atualizado, mas você está removendo dessa forma uma forma muito útil de proteção. Use a solução acima se você realmente deseja vários "administradores", mas mantenha o padrão "conceder todos os privilégios em todas as tabelas no esquema ..." acima para o login para o aplicativo "uso normal".


11
Chris Cogdon, apenas uma pequena correção: alterar o proprietário do banco de dados mydb para dbowner
user876743 14/01
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.