FATAL: role does not exist — что делать

В отличие от многих других баз данных, в PostgreSql нет понятия пользователь, вместо него используется роль. Роль может выступать как пользователь, для подключения к серверу (если у неё есть атрибут LOGIN), и как группа объединяющая несколько других ролей. С помощью такой системы можно гибко управлять правами и разграничивать доступы выдавая только необходимые права.

Пример разграничения прав:

CREATE TABLE prices (
    id integer,
    price numeric
);
GRANT SELECT ON prices TO site_user;
GRANT SELECT, UPDATE, INSERT, DELETE ON prices TO price_manager;
GRANT ALL PRIVILEGES ON prices TO developers;

Что означает ошибка "role does not exist" — такое сообщение об ошибке говорит, что PostgreSQL не нашёл роль (пользователя), который был указан при подключении поэтому аутентификация прерывается и соединение отклоняется.

Пример ошибки:

FATAL: role "user" does not exist

Быстрое решение

  1. Проверьте правильно ли введено имя пользователя
  2. Убедитесь, что подключаетесь к нужной базе и серверу
  3. Проверьте строку подключения в приложении
  4. Подключитесь к PostgreSQL как администратор
  5. Найдите свою роль с помощью запроса SELECT rolname, rolsuper, rolcreatedb, rolcanlogin FROM pg_roles
  6. Проверьте права доступа и настройки аутентификации.
  7. Если роли нет — создайте её

Разберём подробнее причины возникновения

Основные причины:

  • Опечатка в имени пользователя. Названия ролей могут быть чувствительны к регистру (если создать роль в кавычках), или например, при копировании есть шанс "зацепить" лишний пробел
  • Такой роли нет. Возможно её не успел создать ответственный за это администратор, или она была по какой-то причине удалена
  • Неправильная база данных или сервер. Вы подключаетесь не к тому серверу или базе, и там нет нужного пользователя. Проверьте не перепутали ли вы продакшен сервер с сервером для разработки
  • Настройки аутентификации. Конфигурация pg_hba.conf может запрещать подключение для указанной роли или с указанного хоста (pg_hba.conf не вызывает ошибку role does not exist, но может блокировать подключение даже если роль существует.)
  • Неправильно указана строка подключения. Она должна иметь вид postgres://user:password@localhost:5432/database_name

Опишу подробнее шаги по исправлению ошибки

Итак, мы проверили что мы не дураки, и правильно ввели название роли и подключаемся к нужной БД. Что же делать дальше?

Надо подключиться PostgreSQL как администратор

Заходим под суперпользователем (если нет отдельного, то при создании кластера автоматически создаётся роль postgres):


psql -U postgres

Если требуется указать хост и порт:

psql -h localhost -p 5432 -U postgres

Если у вас есть пароль для суперюзера (надеюсь он у вас есть), система запросит его после выполнения команды.

Проверяем есть ли роль:

\du

Команда покажет список всех ролей. Найдите вашу — если её нет, надо будет создать.

Можно также выполнить SQL‑запрос:

SELECT * FROM pg_roles WHERE rolname = 'role_name';

Он выведет роль role_name и информацию по ней (если такая есть)

Создаём роль

В терминале:

createuser app_user -P

SQL‑запрос:

CREATE ROLE role_name WITH LOGIN PASSWORD 'password';

  • LOGIN — разрешает подключение к серверу
  • PASSWORD — задаёт пароль для роли
Дать права:

ALTER ROLE role_name WITH SUPERUSER; -- суперпользователя (если нужно)
GRANT ALL PRIVILEGES ON DATABASE database_name TO role_name; -- права на конкретную базу

После этого снова надо подключиться с новой ролью для проверки.

Если роль существует, а подключиться не получается, то надо проверить файл конфигурации

Файл называется pg_hba.conf (обычно находится в каталоге данных PostgreSQL). Нужно убедиться, что для роли и хоста разрешены подключения. Если есть строка с названием роли и методом reject значит доступ запрещён. Тут работает принцип — применяется первая подходящая строка, поэтому может быть ситуация когда есть reject, но доступ всё равно разрешён, если выше есть более общая строка разрешающая доступ).

Узнать путь к файлу:

SHOW hba_file; -- доступно только для superuser

Пример файла:

# TYPE  DATABASE        USER            ADDRESS                 METHOD
#Доступ с localhost разрешён
  host  all             rolename        localhost               md5
#Доступ с 192.168.1.100/32 запрещён
  host  all             rolename        192.168.1.100/32        reject

Как можно избежать ошибки

  • Составить и поддерживать документацию по пользователям баз данных
  • Использовать скрипты развёртывания — чтобы роли создавались автоматически
  • Проверять окружение перед подключением (dev, test, prod)
  • Настроить резервное копирование конфигураций (postgresql.conf, pg_hba.conf) и списка ролей