Настройки роли можно получить из pg_db_role_setting
, это массив text[]
из <setting name>=<setting value>
. Таким образом, для доступа к отдельным компонентам требуется unnest()
и split_part()
. Кроме того, поскольку для конкретной базы данных может быть задан параметр (см. Параметр IN DATABASE
для команды ALTER ROLE
), нам необходимо задействовать базы данных из pg_database
. Мы соединяем их вместе со всеми ролями от pg_authid
. Чтобы также включить параметры, которые не привязаны к базе данных, но действительны для всех баз данных, мы UNION ALL
пустую базу данных с нулевым OID в списке баз данных. От этого мы можем оставить присоединиться к настройкам роли.
Таким образом, следующее даст вам значение, установленное для 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;