Postgresql: что делает GRANT ALL PRIVILEGES на базе данных?

60

Я пытаюсь предоставить все привилегии для всех таблиц данной базы данных новому пользователю postgres (а не владельцу). Кажется, что GRANT ALL PRIVILEGES ON DATABASE my_db TO new_user;это не так. После успешного выполнения указанной команды (как пользователь postgres), я получаю следующее как new_user:

$ psql -d my_db
my_db => SELECT * FROM a_table_in_my_db;
ERROR:  permission denied for relation a_table_in_my_db

Два вопроса:

1) Что делает вышеприведенная команда, если не предоставляет все разрешения всем таблицам в my_db?

2) Как правильно предоставить пользователю все разрешения на все таблицы? (включая все таблицы, созданные в будущем)

RZ.
источник

Ответы:

80

Ответы на ваши вопросы можно найти в онлайновой документации PostgreSQL 8.4 .

  1. GRANT ALL PRIVILEGES ON DATABASEгранты CREATE, CONNECTи TEMPORARYпривилегия на базы данных к роли (пользователи правильно называется ролями ). Ни одна из этих привилегий фактически не позволяет роли читать данные из таблицы; SELECTДля этого требуется привилегия на столе.

  2. Я не уверен, что существует «правильный» способ предоставления всем привилегиям всех таблиц для роли. Лучший способ обеспечить, чтобы данная роль имела все привилегии для таблицы, - это убедиться, что роль принадлежит таблице. По умолчанию каждый вновь созданный объект принадлежит той роли, которая его создала, поэтому, если вы хотите, чтобы роль имела все привилегии для таблицы, используйте эту роль для ее создания.

    PostgreSQL 9.0 представляет следующий синтаксис, который почти соответствует вашему желанию:

    GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO new_user;

    Проблема в том, что если вы создаете таблицы в схемах вне стандартной схемы по умолчанию, это GRANTне будет применяться к ним. Если вы используете непубличные схемы, у вас будут GRANTправа доступа к этим схемам отдельно.

Стивен Понедельник
источник
1
база данных может иметь несколько владельцев? если да, то как добавить другого владельца?
рз.
нет, я не думаю, что база данных может иметь более одного владельца, хотя вы можете дать им все записи владельца
hellomynameisjoel
15
не забывайте, что вы должны делать то же самое для последовательностей: GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO your_user;или вы не можете вставить какие-либо записи.
Даже если это не работает, попробуйте это: = ПРЕДОСТАВИТЬ ВСЕ ПРИВИЛЕГИИ НА ВСЕХ ТАБЛИЦАХ В SCHEMA public TO your_user;
Kaustubh
10

Можно настроить несколько учетных записей для работы в качестве владельца базы данных:

  • Создайте роль "nologin", чтобы действовать как владелец: create role dbowner nologin
  • Измените владельца вашей базы данных на это: alter database mydb owner dbowner
  • Предоставьте всем своим логинам эту новую роль: grant dbowner to user1, user2

Теперь, если пользователь user1 или user2 войдет, у них есть все разрешения для «mydb» без каких-либо дополнительных разрешений.

Однако я бы тщательно обдумал это решение. Соблазнительно, чтобы ваше веб-приложение использовало один из этих имен входа, чтобы избежать боли при создании дополнительных грантов при каждом обновлении схемы, но таким образом вы удаляете очень полезную форму защиты. Используйте вышеупомянутое решение, если вам действительно нужно несколько «администраторов», но придерживайтесь приведенного выше шаблона «предоставить все привилегии для всех таблиц в схеме ...» для входа в приложение «обычного использования».

Крис Когдон
источник
1
Крис Когдон, небольшое исправление: изменить владельца базы данных mydb на dbowner
user876743