Можно ли включить часовые пояса в список ролей?

#postgresql #psql

#postgresql #psql

Вопрос:

Можно ли создать список ролей postgresql, который включает часовой пояс роли?

Я узнал и протестировал, что сеанс psql будет принимать часовой пояс роли, используемой при входе в систему. Конечно, мы можем изменить роль на определенный часовой пояс с помощью:

 # ALTER ROLE testUser SET timezone TO 'America/Chicago';
 

Но как именно можно получить доступ к этой информации для создания списка, чтобы можно было проверить все роли? Я пробовал du , но это возвращает очень ограниченную информацию. Удивительно (во всяком случае, для меня), что information_schema, похоже, не включает значения часового пояса. Поиск в Интернете до сих пор не помог в этом поиске.

Где еще я могу попробовать?

Ответ №1:

Настройки роли можно получить из pg_db_role_setting , это text[] массив <setting name>=<setting value> . Итак, для этого нужны an unnest() и a split_part() , чтобы добраться до отдельных компонентов. Кроме того, поскольку настройка может быть установлена для конкретной базы данных (см. IN DATABASE Опцию для ALTER ROLE команды), нам нужно задействовать базы данных из pg_database . Мы пересекаем их со всеми ролями из pg_authid . Чтобы также включить настройки, которые не привязаны к базе данных, но действительны для всех баз данных, мы UNION ALL добавим пустую базу данных с нулевым идентификатором OID в список баз данных. Из этого мы можем слева присоединиться к настройкам роли.

Итак, следующее даст вам значение, установленное для timezone для всех баз данных (включая базу данных «все» или «нет») и все роли или null, если значение 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;
 

Комментарии:

1. Вау! Ответ почти сразу И несколько вещей, над которыми нужно провести дополнительные исследования. (Интересно, что настройка может быть установлена для конкретной базы данных — возможно, это ново для меня.) Спасибо, придерживайтесь!