← Назад к вопросам

Какая команда выводит список пользователей в PostgreSQL?

1.0 Junior🔥 121 комментариев
#Базы данных

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Основные команды для вывода списка пользователей в 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. Поэтому все перечисленные команды по сути выводят список ролей, что является правильным и исчерпывающим ответом на вопрос.

Какая команда выводит список пользователей в PostgreSQL? | PrepBro