Eu quero escrever a função para o postgresql 10 para conceder acesso somente leitura a todos os bancos de dados para o usuário especificado (consideravelmente deve ser executado a partir do superusuário)
Mas tenho dificuldades na parte de troca de banco de dados. Eu tento alternar o banco de dados dentro de um cursor, mas recebo um erro que não consigo entender. Como posso corrigir meu script?
CONTEXTO: função PL/pgSQL inline_code_block em EXECUTE
DO $$
DECLARE query text;
cursor cursor
FOR
SELECT '\c '||datname ||';' from pg_database;
BEGIN
OPEN cursor;
LOOP
FETCH cursor INTO query;
EXIT WHEN NOT FOUND;
--raise notice 'Value: %',query;
EXECUTE query;
END LOOP;
CLOSE cursor;
END $$;
PL/pgSQL é a linguagem do servidor.
\c
O comando meta é um recurso do psql. O servidor PostgreSQL não sabe nada sobre\c
comando.Esta é uma tarefa para algum aplicativo cliente. É impossível ler ou alterar algo em outro banco de dados. A conexão está sempre aberta apenas para um banco de dados.
No entanto, você pode usar
dblink
para abrir a conexão com outro banco de dados e iniciar a execução de comandos arbitrários nesse banco de dados. dblink funcionará como um cliente libpq simples.