PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

PostgreSQL:Dê todas as permissões a um usuário em um banco de dados PostgreSQL


Todos os comandos devem ser executados enquanto estiverem conectados ao cluster de banco de dados correto. Certifique-se disso.

Roles são objetos do banco de dados cluster . Todos os bancos de dados do mesmo cluster compartilham o conjunto de funções definidas. Privilégios são concedidos/revogados por banco de dados/esquema/tabela etc.

Uma função precisa de acesso ao banco de dados , obviamente. Isso é concedido a PUBLIC por padrão. Senão:
GRANT CONNECT ON DATABASE my_db TO my_user;

Privilégios básicos para Postgres 14 ou posterior


O Postgres 14 adiciona as funções predefinidas sem login pg_read_all_data / pg_write_all_data .
Eles têm SELECT / INSERT , UPDATE , DELETE privilégios para todos tabelas, visualizações e sequências. Mais USAGE em esquemas. Podemos GRANT participação nestas funções:
GRANT pg_read_all_data TO my_user;
GRANT pg_write_all_data TO my_user;

Isto cobre todos os comandos básicos de DML (mas não DDL, e não alguns comandos especiais como TRUNCATE ou o EXECUTE privilégio para funções!). O manual:

pg_read_all_data

Leia todos os dados (tabelas, visualizações, sequências), como se tivesse SELECT direitos sobre esses objetos e USAGE direitos em todos os esquemas, mesmo sem tê-lo explicitamente. Esta função não tem o atributo de funçãoBYPASSRLS definir. Se o RLS estiver sendo usado, um administrador pode desejar definir BYPASSRLS em funções nas quais esta função é GRANT ed para.

pg_write_all_data

Escreva todos os dados (tabelas, visualizações, sequências), como se tivesse INSERT ,UPDATE e DELETE direitos sobre esses objetos e USAGE direitos em todos os esquemas, mesmo sem tê-lo explicitamente. Esta função não possui o atributo de função BYPASSRLS definir. Se o RLS estiver sendo usado, um administrador pode desejar definir BYPASSRLS em funções que esta função é GRANT ed para.

Todos os privilégios sem usar funções predefinidas (qualquer versão do Postgres)


Os comandos devem ser executados enquanto estiverem conectados ao banco de dados correto. Certifique-se disso.

A função precisa (pelo menos) do USAGE privilégio no esquema . Novamente, se isso for concedido a PUBLIC , você está coberto. Senão:
GRANT USAGE ON SCHEMA public TO my_user;

Ou conceda USAGE em todos 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 Postgres 9.0 ou posterior).
E não se esqueça das sequências (caso existam):
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO my_user;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO my_user;

Alternativamente, você pode usar o "Grant Wizard" do pgAdmin 4 para trabalhar com uma GUI.

Existem alguns outros objetos, o manual para GRANT 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 externo, função, procedimento, linguagem procedural, esquema ou espaço de tabela)

Mas o resto raramente é necessário. Mais detalhes:
  • Como gerenciar PRIVILÉGIOS PADRÃO para USUÁRIOS em um DATABASE versus SCHEMA?
  • Conceder privilégios para um banco de dados específico no PostgreSQL
  • Como conceder todos os privilégios nas visualizações a um usuário arbitrário

Considere atualizar para uma versão atual.