ОШИБКА: разрешение отклонено для отношения 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;