Conceda todas as permissões a um usuário em um banco de dados

206

Eu gostaria de dar a um usuário todas as permissões em um banco de dados sem torná-lo um administrador. A razão pela qual eu quero fazer isso é que, no momento, o DEV e o PROD são DBs diferentes no mesmo cluster, por isso não quero que um usuário possa alterar objetos de produção, mas deve poder alterar objetos no DEV.

Eu tentei:

grant ALL on database MY_DB to group MY_GROUP;

mas parece não dar nenhuma permissão.

Então eu tentei:

grant all privileges on schema MY_SCHEMA to group MY_GROUP;

e parece me dar permissão para criar objetos, mas não para consultar \ excluir objetos nesse esquema que pertencem a outros usuários

Eu poderia continuar dando permissão USAGE ao usuário em MY_SCHEMA, mas ele reclamaria por não ter permissões na tabela ...

Então, acho que minha pergunta é: existe alguma maneira fácil de conceder todas as permissões para um usuário em um banco de dados?

Estou trabalhando no PostgreSQL 8.1.23.

Diego
fonte

Respostas:

271

O usuário precisa acessar o banco de dados , obviamente:

GRANT CONNECT ON DATABASE my_db TO my_user;

E (pelo menos) o USAGEprivilégio no esquema :

GRANT USAGE ON SCHEMA public TO my_user;

Ou conceda USAGEem todos os esquemas personalizados:

DO
$$
BEGIN
   -- RAISE NOTICE '%', (  -- use instead of EXECUTE to see generated commands
   EXECUTE (
   SELECT string_agg(format('GRANT USAGE ON SCHEMA %I TO my_user', nspname), '; ')
   FROM   pg_namespace
   WHERE  nspname <> 'information_schema' -- exclude information schema and ...
   AND    nspname NOT LIKE 'pg\_%'        -- ... system schemas
   );
END
$$;

Em seguida, todas as permissões para todas as tabelas (requer o Postgres 9.0 ou posterior).
E não se esqueça de sequências (se houver):

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO my_user;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO my_user;

Para versões mais antigas, você pode usar o "Assistente de Concessão" do pgAdmin III (a GUI padrão).

Existem outros objetos, o manual paraGRANT tem a lista completa a partir do Postgres 12:

privilégios em um objeto de banco de dados (tabela, coluna, exibição, tabela estrangeira, sequência, banco de dados, wrapper de dados estrangeiros, servidor estrangeiro, função, procedimento, linguagem procedural, esquema ou espaço de tabela)

Mas o resto raramente é necessário. Mais detalhes:

Considere atualizar para uma versão atual .

Erwin Brandstetter
fonte
133
GRANT ALL PRIVILEGES ON DATABASE "my_db" to my_user;
Unkas
fonte
24
A concessão de todos os privilégios ON DATABASEparece poderosa, mas não faz muito. É apenas um começo. Não concede privilégios em objetos contidos.
Erwin Brandstetter
50

No PostgreSQL 9.0+, você faria o seguinte:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA MY_SCHEMA TO MY_GROUP;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA MY_SCHEMA TO MY_GROUP;

Se você deseja habilitar isso também para relações recém-criadas, defina as permissões padrão:

ALTER DEFAULT PRIVILEGES IN SCHEMA MY_SCHEMA
  GRANT ALL PRIVILEGES ON TABLES TO MY_GROUP;
ALTER DEFAULT PRIVILEGES IN SCHEMA MY_SCHEMA
  GRANT ALL PRIVILEGES ON SEQUENCES TO MY_GROUP;

No entanto, como você usa o 8.1, você deve codificá-lo:

CREATE FUNCTION grant_all_in_schema (schname name, grant_to name) RETURNS integer AS $$
DECLARE
  rel RECORD;
BEGIN
  FOR rel IN
    SELECT c.relname
    FROM pg_class c
    JOIN pg_namespace s ON c.namespace = s.oid
    WHERE s.nspname = schname
  LOOP
    EXECUTE 'GRANT ALL PRIVILEGES ON ' || quote_ident(schname) || '.' || rel.relname || ' TO ' || quote_ident(grant_to);
  END LOOP;
  RETURN 1;
END; $$ LANGUAGE plpgsql STRICT;
REVOKE ALL ON FUNCTION grant_all_in_schema(name, name) FROM PUBLIC;

Isso definirá os privilégios em todas as relações: tabelas, visualizações, índices, sequências, etc. Se você quiser restringir isso, filtre pg_class.relkind. Veja os documentos pg_class para detalhes.

Você deve executar esta função como superusuário e tão regular quanto seu aplicativo exigir. Uma opção seria empacotar isso em um trabalho cron que é executado todos os dias ou a cada hora.

Patrick
fonte
Olá Patrick, "TODAS AS TABELAS" não está disponível na versão 8.1 ( postgresql.org/docs/8.1/static/sql-grant.html ) Eu sei que poderia percorrer as tabelas e dar as permissões individualmente, mas é isso que eu sou tentando evitar. mas obrigado pela vossa ajuda #
218 Diego Diego
@ Diego: Solução adicionada para 8.1
Patrick
graças patrick, acabei usando algo como você, mas não usando "GRANT ALL". Por alguma razão, parece não fazer nada. Por exemplo, executei: conceda TODOS no teste de esquema ao usuário A; mas depois disso userA ainda doesnt ter acesso de leitura a partir das tabelas de teste do esquema
Diego
2
Você deve conceder USAGE em um esquema. Em todas as relações dentro desse esquema (tabelas, visualizações, sequências, índices, etc.), é necessário GRANT SELECT, INSERT, UPDATE, DELETE, TRUNCATE separadamente. Esquemas são espaços de nomes, as relações são onde estão os seus dados.
22414 Patrick
28

Fiz o seguinte para adicionar uma função 'eSumit' no banco de dados PostgreSQL 9.4.15 e fornecer toda a permissão para essa função:

CREATE ROLE eSumit;

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO eSumit;

GRANT ALL PRIVILEGES ON DATABASE "postgres" to eSumit;

ALTER USER eSumit WITH SUPERUSER;

Também verificou as empresas pg_table através de:

selecione * em pg_roles; insira a descrição da imagem aqui

Instantâneo de consultas ao banco de dados: insira a descrição da imagem aqui

Sumit Arora
fonte
Eu tenho o Postgres versão 10.3 e gera um erro de sintaxe quando uso aspas no nome do banco de dados.
sajid