我知道这个问题看起来很复杂,但我会在这里更好地解释它。
我有一个选择,连接到并输出集群中连接的数据库的名称,我想在每个数据库中创建一个角色(提到数据库的名称)。
这是我的选择:
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;
字符串
我通过一个批处理脚本运行这个SQL代码,我设法连接到每个数据库并输出它们的名称,但我没有设法为每个数据库创建角色,它只是输出文本“创建角色..."。
我的问题是:有没有可能创造一个这样的角色?如果有,我做错了什么?
另一种我尝试解决的方法是从匿名块内部:
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;
$$
型
然而,记录输出是在圆括号之间的,我不知道如何转义它,看看它是否能通过这个块。
我想知道这两个解决方案中是否有任何一个是有意义的,以及我需要做些什么才能让它们发挥作用。
先谢了。
1条答案
按热度按时间oipij1gg1#
我发现我不需要连接到每个数据库来创建角色,角色的名称会提到集群中数据库的名称,因为角色是全局的。
因此,我已经解决了编写记录和循环的问题,这些记录和循环使用命令中的数据库名称来创建角色。
代码如下:
字符串