ПОМИЛКА: відмовлено у дозвілі на ім'я таблиці відносин у Postgres під час спроби SELECT як користувача лише для читання


89
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;

Користувач лише для читання може підключитися, переглянути таблиці, але коли він намагається зробити простий вибір, він отримує:

ERROR: permission denied for relation mytable
SQL state: 42501

Це відбувається на PostgreSQL 9.1

Що я зробив неправильно?


1
Чи можете ви надати детальну інформацію про "Relationship Mytable"? Схема, це "справжня" таблиця (або подання / функція), тригери ...
Ігор Романченко

Відповіді:


162

Ось повне рішення для 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/ за кілька важливих аспектів

Якщо хтось знайде коротший код, і бажано той, який зможе виконати це для всіх існуючих баз даних, додаткові похвали.


6
це включає погляди?
Frank Conry

9
Чому ви GRANT ALLза замовчуванням надаєте дозвіл користувачеві, лише для читання?
Слава Фомін II

1
я дав точно так, як це визначено, все ще помилка Сем
Аніш Гопінат

може підтвердити права, надані за допомогою \ddp. Має відображатися так само, =r/як granting_user=r/readonly_userдля доступу лише для читання.
Грег Брей,

Це дослівний SQL із запитання. Я не бачу, як це забезпечує рішення.
r351574nc3

12

Спробуйте додати

GRANT USAGE ON SCHEMA public to readonly;

Ви, мабуть, не знали, що для використання об’єктів у схемі потрібно мати необхідні дозволи на схему.


Що - то дивне відбувається, я біг цих команд на сервері , використовуючи в psqlякості postgresкористувача і я отримую правильну відповідь, GRANT. Тим не менше, коли я переглядаю ACL у таблицях, я бачу лише два інших облікових записи, один з яких є власником бази даних, jirauserа інший - лише для читання qauser. Але моя readonlyтам не з'являється. Postgres - це версія 9.1, і я навіть перезапустив сервер, все одно нічого не відбувається.
сорін

2
що є / було виведено \ du у консолі psql? Чи можете ви все-таки дати цей результат, або це вже виправлено, як у вашій відповіді?
sufleR

Я насправді не знаю, що сталося, оскільки результат був правильним (ГРАНТ). YEsterday це не спрацювало, але сьогодні воно спрацювало після запуску, знову ж таки, всіх 3 команд.
сорін

3
Примітка: Очікувана відповідь на це просто "ГРАНТ". Якщо ви бачите "ПОПЕРЕДЖЕННЯ: жодних привілеїв не надано для" загальнодоступних "", це НЕ ПРАЦЮВАЛО. Користувач лише для читання не може надати собі додаткові дозволи. Це може зробити лише користувач із дозволом "GRANT", тому вам, мабуть, потрібно увійти як суперкористувач.
PeterVermont

Привіт, коли я намагаюся НАДАТИ ВИБІР ВСІХ СТОЛІВ В СХЕМІ загальнодоступних postgres; він відповідає: ПОМИЛКА: відмовлено в дозвілі на відновлення бази даних changeloglock. Ви знаєте, що я роблю не так? Дякую (це відбувається на GAppEngine Posgres9.6 за допомогою публічної адреси та доступу через термінал)
Майк

-5

Це працювало для мене:

Перевірте поточну роль, до якої ви ввійшли, використовуючи: SELECT CURRENT_USER, SESSION_USER;

Примітка : Він повинен збігатися з Власником схеми.

Схема | Назва | Тип | Власник
-------- + -------- + ------- + ----------

Якщо власник інший, надайте всі гранти поточній ролі користувача від ролі адміністратора:

НАДАЙТЕ 'ROLE_OWNER' на 'ПОТОЧНЕ РОЛЕНИМ';

Потім спробуйте виконати запит, він дасть результат, оскільки він має доступ до всіх відносин зараз.


5
Зміна власника на користувача під назвою readonly навряд чи звучить як правильне виправлення.
Анна

Залежно від вашого випадку причиною може бути неправильний власник столу (це був недруг). Правильний спосіб таблиці змін ownershiip в PostgreSQL: см stackoverflow.com/a/13535184
tanius

-6

переконайтеся, що ваш користувач має атрибути своєї ролі. наприклад:

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


18
Немає! Надання ролі суперкористувача користувачеві під назвою "тільки для читання", щоб зробити "вибір", не є правильним виправленням.
Анна

@Anna Це не те, що тут відбувається. Цей потік не стосується надання доступу лише для читання. Цей потік стосується надання користувачеві доступу, щоб надати іншому користувачеві доступ лише для читання. ІМХО, це правильно. Якщо ваш користувач не є суперкористувачем, ви не можете створити користувача лише для читання. Помилка, з якою виникла помилка, пов’язана з можливістю створити користувача, який може читати лише ERROR: permission denied for relation mytable
читачем

-7

Вам слід виконати наступний запит:

GRANT ALL ON TABLE mytable TO myuser;

Або якщо ваша помилка знаходиться у поданні, то, можливо, таблиця не має дозволу, тому вам слід виконати наступний запит:

GRANT ALL ON TABLE tbm_grupo TO myuser;

5
Користувача називають "лише для читання". Сумнівно, що метою є надання користувачеві всіх дозволів. Він просто хоче зробити відбір.
Анна

Це перешкоджає призначенню імені користувача "ReadOnly", якщо ви надаєте ALTER DROP DELETEEct. Для цього користувача ...
JayRizzo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.