GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;
Пользователь только для чтения может подключиться, просмотреть таблицы, но когда он попытается сделать простой выбор, он получит:
ERROR: permission denied for relation mytable
SQL state: 42501
Это происходит в PostgreSQL 9.1.
Что я сделал не так?
postgresql
Сорин
источник
источник
Ответы:
Вот полное решение для 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 SELECT 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;
Спасибо https://jamie.curle.io/creating-a-read-only-user-in-postgres/ за несколько важных аспектов.
Если кто-нибудь найдет более короткий код, и желательно такой, который может выполнить это для всех существующих баз данных, особого уважения.
источник
GRANT ALL
по умолчанию даете разрешение пользователю только для чтения?\ddp
. Должен отображаться так же,=r/
какgranting_user=r/readonly_user
для доступа только для чтения.Попробуй добавить
GRANT USAGE ON SCHEMA public to readonly;
Вы, вероятно, не знали, что для использования объектов в схеме необходимо иметь необходимые разрешения для схемы.
источник
psql
какpostgres
пользователь, и получаю правильный ответGRANT
. Тем не менее, когда я смотрю на ACL в таблицах, я вижу только две другие учетные записи, одна из которых является владельцем базы данных,jirauser
а другая - учетной записью с именем только для чтенияqauser
. Но моегоreadonly
там нет. Postgres - это версия 9.1, и я даже перезапустил сервер, но ничего не произошло.Это сработало для меня:
Проверьте текущую роль, в которую вы вошли, используя: SELECT CURRENT_USER, SESSION_USER;
Примечание : он должен совпадать с владельцем схемы.
Схема | Имя | Тип | Владелец
-------- + -------- + ------- + ----------
Если владелец другой, то предоставьте все права текущей роли пользователя из роли администратора:
GRANT 'ROLE_OWNER' в 'CURRENT ROLENAME';
Затем попробуйте выполнить запрос, он выдаст результат, поскольку теперь у него есть доступ ко всем отношениям.
источник
убедитесь, что у вашего пользователя есть атрибуты для его роли. например:
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
источник
ERROR: permission denied for relation mytable
Вам следует выполнить следующий запрос:
GRANT ALL ON TABLE mytable TO myuser;
Или, если ваша ошибка находится в представлении, возможно, таблица не имеет разрешения, поэтому вам следует выполнить следующий запрос:
GRANT ALL ON TABLE tbm_grupo TO myuser;
источник
ALTER DROP DELETE
лишает пользователя имени ReadOnly, если вы используете Ect.