Sei que a pergunta parece complexa, mas vou explicar melhor aqui.
Eu tenho um select que conecta e gera os nomes dos bancos de dados conectados em um cluster e gostaria de criar uma função (mencionando o nome do banco de dados) dentro de cada banco de dados.
Esta é a minha seleção:
select '\c '||t1.datname||chr(10)||'
SELECT ''Database: ''||current_database();
SELECT '' create role "'||t1.datname||'_connect'||'" '';
'
from pg_database t1
where t1.datname not in ('template0', 'template1', 'postgres')
order by datname;
Eu executo esse código SQL através de um script em lote e consigo me conectar a todos os bancos de dados e gerar seus nomes, mas não consigo criar as funções para cada banco de dados, apenas gera o texto "criar função...".
Minha pergunta é: é possível criar uma função como essa? E se sim, o que estou fazendo de errado?
Outra forma que tentei resolver foi dentro de um bloco anônimo:
do
$$
declare
rec record;
db_name text;
begin
for rec in select t1.datname
from pg_database t1
where t1.datname not in ('template0', 'template1', 'postgres')
order by datname
loop
execute 'select ''\c '' '||rec||'
from pg_database t1
where t1.datname not in (''template0'', ''template1'', ''postgres'')
order by datname;
';
SELECT current_database()
into db_name;
raise notice 'Database: %', db_name;
execute ' create role "'||rec||'_connect'||'" ';
raise notice 'ROLE CREATED';
end loop;
end;
$$
Porém, a saída do registro está entre parênteses e não sei como escapar dela para ver se funcionaria através deste bloco.
Gostaria de saber se alguma das duas soluções faz sentido e o que preciso fazer para que funcionem.
Desde já, obrigado.