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.
grant usagepara o novo esquema.