我知道这个问题看起来很复杂,但我会在这里更好地解释它。
我有一个连接并输出集群中已连接数据库的名称的选择,我想在每个数据库内创建一个角色(提及数据库的名称)。
这是我的选择:
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;
$$
但是,记录输出位于括号之间,我不知道如何转义它以查看它是否可以通过此块。
我想知道这两种解决方案是否有意义以及我需要做什么才能使它们发挥作用。
提前致谢。
您无法在语句内连接到不同的数据库。PostgreSQL 连接在其整个生命周期内都与单个数据库绑定。但你很幸运:由于角色是全局对象(它们不是数据库的一部分,但对所有数据库来说都是通用的),因此在创建角色时连接到哪个数据库并不重要。
您使用动态 SQL 的方法很好。只需跳过连接到不同数据库的尝试。