Можно ли включить часовые пояса в список ролей? - PullRequest
3 голосов
/ 16 апреля 2019

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

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

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

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

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

1 Ответ

3 голосов
/ 16 апреля 2019

Настройки роли можно получить из 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...