Какая команда выводит список пользователей в PostgreSQL?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Основные команды для вывода списка пользователей в PostgreSQL
Для получения списка пользователей (ролей) в PostgreSQL существует несколько команд, выбор которой зависит от нужного уровня детализации и формата вывода.
1. Основная команда \du в psql
При работе в интерактивной консоли psql наиболее удобной и часто используемой является метакоманда \du (или её расширенная версия \du+).
-- Базовая информация о ролях
\du
-- Подробная информация, включая описание и атрибуты
\du+
Эти команды выводят таблицу с именами ролей, их атрибутами (суперпользователь, создание ролей, создание БД и т.д.), списком членств в других группах и, в случае \du+, описанием.
2. Запрос к системным каталогам (SQL)
Для скриптов или когда требуется программная обработка, необходимо использовать SQL-запросы к системным представлениям pg_roles или pg_user.
Запрос к pg_roles (наиболее полный):
SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolconnlimit, rolvaliduntil
FROM pg_roles
ORDER BY rolname;
Это представление содержит всю информацию о ролях, включая системные роли (например, postgres).
Запрос к pg_user (только пользователи для входа):
SELECT usename, usesuper, usecreatedb, usecreaterole, usecatupd, valuntil
FROM pg_user
ORDER BY usename;
pg_user — это упрощённое представление, показывающее только роли с атрибутом LOGIN (т.е., тех, кто может подключиться к БД).
3. Использование pg_shadow (только для суперпользователей)
Для получения информации о паролях (в хэшированном виде) существует системное представление pg_shadow. Доступ к нему имеет только суперпользователь.
SELECT usename, passwd, valuntil
FROM pg_shadow
ORDER BY usename;
Важно! Это представление содержит конфиденциальные данные, и его использование в скриптах должно быть строго обосновано.
4. Детализированные запросы с JOIN
Для более сложных задач, например, получения списка пользователей с их привилегиями на конкретные базы данных, потребуются запросы с соединениями.
SELECT
r.rolname AS username,
CASE WHEN r.rolcanlogin THEN 'YES' ELSE 'NO' END AS can_login,
r.rolcreatedb AS can_create_db,
r.rolcreaterole AS can_create_roles,
ARRAY(SELECT b.datname FROM pg_database b WHERE has_database_privilege(r.oid, b.oid, 'CONNECT')) AS accessible_databases
FROM pg_roles r
WHERE r.rolname NOT LIKE 'pg_%' -- Фильтрация системных ролей
ORDER BY r.rolname;
Практические рекомендации
- Для администрирования в консоли: Используйте
\du+— это быстро и информативно. - Для скриптов и автоматизации: Всегда предпочитайте SQL-запросы к
pg_roles. Это обеспечивает стабильный, парсируемый вывод. - Для проверки прав: Комбинация
pg_rolesс функциейpg_has_role()илиhas_database_privilege()даст полную картину. - Безопасность: Помните, что пароли из
pg_shadow— это хэши, но их раскрытие всё равно несёт риски. Ограничивайте доступ к таким запросам.
Различие между ролями и пользователями в PostgreSQL чисто семантическое: пользователь — это роль с атрибутом LOGIN. Поэтому все перечисленные команды по сути выводят список ролей, что является правильным и исчерпывающим ответом на вопрос.