Назад | Перейти на главную страницу

Postgresql: что делает GRANT ALL PRIVILEGES ON DATABASE?

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

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

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

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

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

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