Вопрос: Postgresql: что делает ГРАНТ ВСЕ ПРИВИЛЕГИИ НА БАЗЕ ДАННЫХ?


Я пытаюсь предоставить все привилегии для всех таблиц данной базы данных новому пользователю 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) Каким образом можно предоставить все разрешения для всех таблиц для пользователя? (в том числе на всех таблицах, созданных в будущем)


53
2017-11-04 02:45


Источник




Ответы:


Ответы на ваши вопросы взяты из онлайн-документы 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 привилегии для этих схем отдельно.


74
2017-11-04 04:28



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


В качестве владельца базы данных можно настроить несколько логинов:

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

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

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


6
2017-12-17 01:43