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 WHERE
clá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 GRANT
instrução construída para a -c
opçã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 %I
especificador 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_namespace
pode ser encontrado no pg_catalog
esquema. Confira os outros objetos lá - eles armazenam todos os aspectos de seus esquemas, tabelas e assim por diante.
grant usage
para o novo esquema.