В отличие от многих других баз данных, в 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
Быстрое решение
- Проверьте правильно ли введено имя пользователя
- Убедитесь, что подключаетесь к нужной базе и серверу
- Проверьте строку подключения в приложении
- Подключитесь к PostgreSQL как администратор
- Найдите свою роль с помощью запроса
SELECT rolname, rolsuper, rolcreatedb, rolcanlogin FROM pg_roles - Проверьте права доступа и настройки аутентификации.
- Если роли нет — создайте её
Разберём подробнее причины возникновения
Основные причины:
- Опечатка в имени пользователя. Названия ролей могут быть чувствительны к регистру (если создать роль в кавычках), или например, при копировании есть шанс "зацепить" лишний пробел
- Такой роли нет. Возможно её не успел создать ответственный за это администратор, или она была по какой-то причине удалена
- Неправильная база данных или сервер. Вы подключаетесь не к тому серверу или базе, и там нет нужного пользователя. Проверьте не перепутали ли вы продакшен сервер с сервером для разработки
- Настройки аутентификации. Конфигурация
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
Команда покажет список всех ролей. Найдите вашу — если её нет, надо будет создать.
SELECT * FROM pg_roles WHERE rolname = 'role_name';
Он выведет роль role_name и информацию по ней (если такая есть)
Создаём роль
createuser app_user -P
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) и списка ролей