PostgreSQL LinuxWindowsсервер PostgreSQL

PostgreSQL: После изменения прав роли приложение не может читать таблицу

  • Обновлено
  • Чтение ≈ 2 минуты
  • Нужны права администратора

Краткий ответ

После REVOKE или изменения членства роли приложение получает permission denied for table. Надо установить, изменилось ли право SELECT, право USAGE схемы, наследование роли или подключение под другой учётной записью.

В этой статье
  1. Симптом и границы применимости
  2. Как отличить возможные причины
  3. Пошаговая диагностика и безопасное исправление
  4. Как проверить, что проблема устранена
  5. Если исправление не помогло

#Симптом и границы применимости

После REVOKE или изменения членства роли приложение получает permission denied for table. Надо установить, изменилось ли право SELECT, право USAGE схемы, наследование роли или подключение под другой учётной записью.

#Как отличить возможные причины

Возможная причинаКак узнатьЧто делать
Отозвано SELECTПриложение имеет доступ к схеме, но не может читать конкретную таблицу.permission denied for tableВыдать минимум SELECT после согласования
Пропало USAGE схемыРоль не может разрешить имя таблицы в закрытой схеме.permission denied for schemaПроверить USAGE
Изменено членствоПрава группы перестали наследоваться.Проблема после ALTER ROLE/REVOKE ROLEСверить членство и наследование

#Пошаговая диагностика и безопасное исправление

  1. 1. Узнайте эффективного пользователяОткройте соединение из приложения или тестового клиента с теми же параметрами; выполните SELECT current_user, session_user. В журнале найдите объект после permission denied и точную операцию.
    SQLКоманда
    psql; чтение идентичности реальной сессии.
    SELECT current_user, session_user;
  1. 2. Зафиксируйте права до измененийУ владельца базы запросите список существующих привилегий на схему и таблицу; сделайте резервную копию настроек ролей. Не пытайтесь исправить всё командой GRANT ALL ON ALL TABLES.
  1. 3. Проверьте две разные привилегииОт администратора выполните has_schema_privilege и has_table_privilege для точной роли. Если USAGE=false, одного SELECT недостаточно; если SELECT=false, одного USAGE недостаточно.
    SQLКоманда
    Чтение; замените роль, схему, таблицу.
    SELECT has_schema_privilege('app_user','app','USAGE') AS schema_ok, has_table_privilege('app_user','app.orders','SELECT') AS table_ok;
  1. 4. Посмотрите роль и выданные ей группыВ psql выполните \du или прочитайте pg_auth_members через разрешённые представления. Сравните с ранее утверждённой схемой доступа. В новых версиях PostgreSQL наследование членства может быть настроено отдельно.
  2. Дополнительная команда по теме
    ТекстКоманда
    Мета-команда именно psql; показывает свойства роли, но подробные права объектов проверяйте SQL.
    \du app_user
  1. 5. Восстановите только необходимые привилегииНа тестовой базе владелец схемы или администратор может вернуть USAGE на app и SELECT на конкретную таблицу. Если приложение пишет данные, перечень прав должен быть отдельно обоснован.
  2. Дополнительная команда по теме
    SQLС осторожностьюПрава администратора
    Только согласованное исправление на тестовой базе; требует полномочий владельца/администратора БД.
    GRANT USAGE ON SCHEMA app TO app_user;
    GRANT SELECT ON TABLE app.orders TO app_user;

    Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.

  1. 6. Проверьте вход под сервисной рольюСоздайте новое соединение app_user и выполните безопасный SELECT LIMIT 1. Не проверяйте только из-под суперпользователя: он часто обходит ограничения.
    SQLКоманда
    В отдельной сессии app_user; чтение одной строки.
    SELECT * FROM app.orders LIMIT 1;
  1. 7. Зафиксируйте корректное управление доступомОбновите миграции и декларативные правила выдачи прав, чтобы следующий выпуск вновь не отозвал их. Проверьте, что у приложения нет лишних INSERT/DELETE и доступа к другим схемам.

#Как проверить, что проблема устранена

Новая сессия сервисного пользователя читает нужную таблицу без расширения прав на остальные объекты.

#Если исправление не помогло

Если проверка прав положительна, исследуйте row-level security, ошибку схемы и принадлежность к другим ролям; RLS может скрывать строки без ошибки.

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.