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

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;