CONCESSÃO DE USO em todos os esquemas em um banco de dados?

12

Quero GRANT USAGEum usuário / função para um determinado banco de dados. O banco de dados tem muitos esquemas.

Eu sei que existe ON ALL TABLES IN SCHEMA, mas quero "todos os esquemas". Eu tentei GRANT USAGE .. ON DATABASE, mas isso está obviamente errado (na verdade não existe ).

Para o Postgres 9.3 ou 9.4, é um servidor que está no AWS RDS.

tedder42
fonte

Respostas:

17

Você tem pelo menos duas opções.

O primeiro faz uso de uma pequena consulta e um editor de texto. Temos que coletar os esquemas de nosso interesse:

SELECT nspname
  FROM pg_namespace;

Você pode adicionar uma WHEREcláusula se desejar limitar o escopo. Copie a saída e altere-a para obter vários GRANT USAGE ON SCHEMA ... TO your_role;comandos. Em seguida, basta alimentá-lo para psql, por exemplo:

psql -f multigrant.sql

Uma variante usual disso pode ser um script de shell que circula sobre os nomes e chamadas coletados psql, passando a GRANTinstrução construída para a -copção

A outra solução faz basicamente o mesmo em um bloco pl / pgsql, criando uma consulta dinâmica. O núcleo é o mesmo - temos que coletar os esquemas. Em seguida, fazemos um loop sobre todos eles, concedendo o esquema de permissões por esquema:

DO $do$
DECLARE
    sch text;
BEGIN
    FOR sch IN SELECT nspname FROM pg_namespace
    LOOP
        EXECUTE format($$ GRANT USAGE ON SCHEMA %I TO your_role $$, sch);
    END LOOP;
END;
$do$;

Notas :

  • ao contrário de tabelas, seqüências, funções e tipos, não é possível definir privilégios padrão para esquemas (a partir da versão 9.4). Você precisará conceder esse privilégio para qualquer esquema adicionado recentemente manualmente.
  • aqui estou usando a cotação do dólar ao criar a consulta dinâmica. Isso me permite usar a sintaxe 'normal', em vez de multiplicar aspas simples, por exemplo (não presente neste exemplo). Dessa forma, a maioria dos editores destacará bem as declarações.
  • Também uso format()com o %Iespecificador de formato para que o nome do objeto seja citado corretamente, se necessário. Essa abordagem é muito mais legível do que criar a consulta com concatenação de constantes de string e algumas quote_ident()chamadas.
  • pg_namespacepode ser encontrado no pg_catalogesquema. Confira os outros objetos lá - eles armazenam todos os aspectos de seus esquemas, tabelas e assim por diante.
dezso
fonte
1
Gostaria de saber se você poderia simular privilégios padrão para esquemas recém-criados usando um gatilho de evento que executa automaticamente o grant usagepara o novo esquema.
A_horse_with_no_name
@a_horse_with_no_name pensando sobre isso, não vejo atualmente nenhuma razão para que isso não possa ser feito.
Dez15
0

Você pode usar também.

DO $do$
DECLARE
    sch text;
BEGIN
    FOR sch IN SELECT nspname FROM pg_namespace where nspname != 'pg_toast' 
    and nspname != 'pg_temp_1' and nspname != 'pg_toast_temp_1'
    and nspname != 'pg_statistic' and nspname != 'pg_catalog'
    and nspname != 'information_schema'
    LOOP
        EXECUTE format($$ GRANT USAGE ON SCHEMA %I TO your_role $$, sch);
        EXECUTE format($$ GRANT USAGE ON SCHEMA %I to your_role $$, sch);
        EXECUTE format($$ GRANT SELECT ON ALL SEQUENCES IN SCHEMA %I TO your_role $$, sch);
        EXECUTE format($$ GRANT SELECT ON ALL TABLES IN SCHEMA %I TO backup_user $$, sch);

        EXECUTE format($$ ALTER DEFAULT PRIVILEGES IN SCHEMA %I GRANT SELECT ON TABLES TO your_role $$, sch);
        EXECUTE format($$ ALTER DEFAULT PRIVILEGES IN SCHEMA %I GRANT SELECT ON SEQUENCES TO your_role $$, sch);
    END LOOP;
END;
$do$;
Mateus Padua
fonte