是否可以在角色列表中包含时区?
Is it possible to include timezones in list of roles?
能否生成包含角色时区的 postgresql 角色列表?
我已经了解到并测试过,psql 会话将采用登录时使用的角色的时区。当然,我们可以将角色更改为特定时区:
# ALTER ROLE testUser SET timezone TO 'America/Chicago';
但究竟如何访问该信息以生成列表以便检查所有角色?我试过 \du+,但是 returns 的信息非常有限。令人惊讶的是(无论如何对我来说) information_schema 似乎不包括时区值。到目前为止,互联网搜索对这个问题没有帮助。
我还能在哪里尝试?
可以从 pg_db_role_setting
中检索角色的设置,它是 <setting name>=<setting value>
的 text[]
数组。所以这需要一个 unnest()
和一个 split_part()
来访问各个组件。此外,由于可以为特定数据库设置设置(请参阅 ALTER ROLE
命令的 IN DATABASE
选项),我们需要涉及来自 pg_database
的数据库。我们将他们与 pg_authid
中的所有角色交叉加入。为了还包括未绑定到数据库但对所有数据库都有效的设置,我们 UNION ALL
一个 OID 为零的空数据库到数据库列表。从那里我们可以离开加入角色设置。
因此,下面将为您提供所有数据库(包括 "all" 或 "none" 数据库)和所有角色的 timezone
值集,如果 timezone
没有为数据库中的用户设置。
SELECT rol.rolname,
dat.datname,
split_part(kvp.kvp, '=', 2) timezone
FROM pg_authid rol
CROSS JOIN (SELECT dat.oid,
dat.datname
FROM pg_database dat
UNION ALL
SELECT 0::oid oid,
'' datname) dat
LEFT JOIN pg_db_role_setting set
ON set.setdatabase = dat.oid
AND set.setrole = rol.oid
LEFT JOIN LATERAL unnest(set.setconfig) kvp (kvp)
ON lower(split_part(kvp.kvp, '=', 1)) = 'timezone'
ORDER BY 1,
2;
能否生成包含角色时区的 postgresql 角色列表?
我已经了解到并测试过,psql 会话将采用登录时使用的角色的时区。当然,我们可以将角色更改为特定时区:
# ALTER ROLE testUser SET timezone TO 'America/Chicago';
但究竟如何访问该信息以生成列表以便检查所有角色?我试过 \du+,但是 returns 的信息非常有限。令人惊讶的是(无论如何对我来说) information_schema 似乎不包括时区值。到目前为止,互联网搜索对这个问题没有帮助。
我还能在哪里尝试?
可以从 pg_db_role_setting
中检索角色的设置,它是 <setting name>=<setting value>
的 text[]
数组。所以这需要一个 unnest()
和一个 split_part()
来访问各个组件。此外,由于可以为特定数据库设置设置(请参阅 ALTER ROLE
命令的 IN DATABASE
选项),我们需要涉及来自 pg_database
的数据库。我们将他们与 pg_authid
中的所有角色交叉加入。为了还包括未绑定到数据库但对所有数据库都有效的设置,我们 UNION ALL
一个 OID 为零的空数据库到数据库列表。从那里我们可以离开加入角色设置。
因此,下面将为您提供所有数据库(包括 "all" 或 "none" 数据库)和所有角色的 timezone
值集,如果 timezone
没有为数据库中的用户设置。
SELECT rol.rolname,
dat.datname,
split_part(kvp.kvp, '=', 2) timezone
FROM pg_authid rol
CROSS JOIN (SELECT dat.oid,
dat.datname
FROM pg_database dat
UNION ALL
SELECT 0::oid oid,
'' datname) dat
LEFT JOIN pg_db_role_setting set
ON set.setdatabase = dat.oid
AND set.setrole = rol.oid
LEFT JOIN LATERAL unnest(set.setconfig) kvp (kvp)
ON lower(split_part(kvp.kvp, '=', 1)) = 'timezone'
ORDER BY 1,
2;