Postgresql 是否可以在角色列表中包含时区?

Postgresql 是否可以在角色列表中包含时区?,postgresql,psql,Postgresql,Psql,是否可以生成包含角色时区的postgresql角色列表 我了解并测试了psql会话将在登录时使用角色的时区。当然,我们可以通过以下方式将角色更改为特定时区: # ALTER ROLE testUser SET timezone TO 'America/Chicago'; 但是,究竟如何访问这些信息来生成一个列表,以便检查所有角色?我尝试了\du+,但返回的信息非常有限。令人惊讶的是(无论如何对我来说)信息模式似乎不包括时区值。到目前为止,互联网搜索对这项任务没有帮助 我还可以在哪里尝试?角色的

是否可以生成包含角色时区的postgresql角色列表

我了解并测试了psql会话将在登录时使用角色的时区。当然,我们可以通过以下方式将角色更改为特定时区:

# ALTER ROLE testUser SET timezone TO 'America/Chicago';
但是,究竟如何访问这些信息来生成一个列表,以便检查所有角色?我尝试了\du+,但返回的信息非常有限。令人惊讶的是(无论如何对我来说)信息模式似乎不包括时区值。到目前为止,互联网搜索对这项任务没有帮助


我还可以在哪里尝试?

角色的设置可以从
pg\u db\u role\u设置中检索,它是
文本[]
数组
=
。因此,这需要一个
unnest()
和一个
split\u part()
来访问各个组件。此外,由于可以为特定数据库设置设置(请参见
ALTER ROLE
命令的
IN database
选项),因此我们需要涉及
pg_database
中的数据库。我们使用
pg\u authid
中的所有角色交叉连接它们。为了还包括未绑定到数据库但对所有数据库有效的设置,我们
UNION all
将OID为零的空数据库添加到数据库列表中。从这里我们可以加入角色设置

因此,下面将为所有数据库(包括“全部”或“无”数据库)和所有角色提供为
时区设置的值,如果未为数据库中的用户设置
时区
,则为null

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;

哇!一个答案几乎是立即的,还有一些事情需要做更多的研究。(有趣的是,可以为特定的db设置一个设置-这对我来说可能是新的。)谢谢!