ОШИБКА: разрешение отклонено для отношения tablename на Postgres при попытке SELECT как пользователя, использующего только для чтения
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;
Пользователь readonly может подключаться, видеть таблицы, но когда он пытается сделать простой выбор, он получает:
ERROR: permission denied for relation mytable
SQL state: 42501
Это происходит на PostgreSQL 9.1
Что я сделал не так?
Ответы
Ответ 1
Вот полное решение для PostgreSQL 9+, недавно обновленное.
CREATE USER readonly WITH ENCRYPTED PASSWORD 'readonly';
GRANT USAGE ON SCHEMA public to readonly;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly;
-- repeat code below for each database:
GRANT CONNECT ON DATABASE foo to readonly;
\c foo
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO readonly; --- this grants privileges on new tables generated in new database "foo"
GRANT USAGE ON SCHEMA public to readonly;
GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;
Благодаря http://jamie.curle.io/creating-a-read-only-user-in-postgres/ для нескольких важных аспектов
Если кто-то найдет более короткий код и, желательно, тот, который способен выполнить это для всех существующих баз данных, добавляет дополнительные преимущества.
Ответ 2
Попробуйте добавить
GRANT USAGE ON SCHEMA public to readonly;
Вероятно, вы пропустили, что у вас должны быть разрешения на использование схем в этой схеме.
Ответ 3
Это сработало для меня:
Проверьте текущую роль, в которую вы вошли, используя:
SELECT CURRENT_USER, SESSION_USER;
Примечание. Он должен совпадать с владельцем схемы.
Схема | Имя | Тип | Владелец
-------- + -------- + ------- + ----------
Если владелец отличается, то предоставите все гранты текущей роли пользователя из роли администратора:
GRANT 'ROLE_OWNER' для "ТЕКУЩЕГО РОЛИНАМА";
Затем попробуйте выполнить запрос, он даст результат, так как теперь он имеет доступ ко всем отношениям.
Ответ 4
убедитесь, что ваш пользователь имеет атрибуты своей роли. например:
postgres=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------+-----------
flux | | {}
postgres | Superuser, Create role, Create DB, Replication | {}
после выполнения следующей команды:
postgres=# ALTER ROLE flux WITH Superuser;
ALTER ROLE
postgres=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------+-----------
flux | Superuser | {}
postgres | Superuser, Create role, Create DB, Replication | {}
он исправил проблему.
см. учебник для ролей и всего здесь: https://www.digitalocean.com/community/tutorials/how-to-use-roles-and-manage-grant-permissions-in-postgresql-on-a-vps--2
Ответ 5
Вы должны выполнить следующий запрос:
GRANT ALL ON TABLE mytable TO myuser;
Или, если ваша ошибка в представлении, возможно, у таблицы нет разрешения, поэтому вы должны выполнить следующий запрос:
GRANT ALL ON TABLE tbm_grupo TO myuser;