Быстрая версия:
Какую команду следует выполнить, чтобы позволить владельцу базы данных разрешить ему доступ к таблицам в этой базе данных, и это можно сделать из учетной записи этого владельца?
Более длинная версия:
Я создаю базу данных на RDS. У меня есть пользователь root, который я настроил с помощью Amazon.
Amazon автоматически создает групповую роль «rds_superuser», которая очень привилегирована, но на самом деле не является суперпользователем.
Я создаю базу данных и пользователя для приложения следующим образом:
create database master_integration;
CREATE ROLE master_application LOGIN ENCRYPTED PASSWORD '...' VALID UNTIL 'infinity';
GRANT ALL ON DATABASE master_integration TO GROUP rds_superuser WITH GRANT OPTION;
GRANT ALL ON DATABASE master_integration TO GROUP master_application;
\c master_integration;
ALTER DEFAULT PRIVILEGES GRANT INSERT, SELECT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER ON TABLES TO rds_superuser;
Я обновил этот сценарий, чтобы отразить предложения Крейга Рингера относительно того, как мне следует с этим справляться.
Когда приложение подключается (с учетными данными master_application), оно создает (и, следовательно, владеет) таблицы.
Моя проблема в том, что я не могу использовать свой административный (rootish) вход в систему для выполнения запросов, потому что у этого пользователя нет прав доступа к таблице.
Я мог решить эту проблему раньше, запустив следующее из учетной записи приложения:
GRANT ALL privileges ON ALL TABLES IN SCHEMA public to rds_superuser;
Но это кажется хакерским, чтобы подчиненный пользователь предоставлял привилегии обратно администратору.
Итак ... Есть ли команда, которую я могу выполнить до или после создания таблиц из приложения, которая обеспечит доступ владельца базы данных к таблицам в базе данных?
обновить после повторной попытки изменить привилегии по умолчанию ...
Это все еще не предоставляет доступ к таблицам; Я вижу, что это предлагается в другом месте, и это имеет полный смысл, но это не работает для меня. Из оболочки psql:
master_integration=> \ddp
Default access privileges
Owner | Schema | Type | Access privileges
------------------+--------+-------+-------------------------------------------
integration_root | | table | integration_root=arwdDxt/integration_root+
| | | rds_superuser=arwdDxt/integration_root
(1 row)
master_integration=> \dp users
Access privileges
Schema | Name | Type | Access privileges | Column access privileges
--------+-------+-------+-------------------+--------------------------
public | users | table | |
(1 row)
мой пользователь с правами суперпользователя - мой_интерфейс, а пользователи - это таблица в моей базе данных.
Обновить
Я получил довольно бесполезный ответ от кого-то из Amazon.
Они попросили меня позвонить в ALTER DEFAULT PRIVILEGES из логина master_application. Хотя это, вероятно, сработает, оно не ответит на мой вопрос (как я могу сделать это исключительно из учетной записи rds_superuser).
Я попросил их уточнить это, и они ушли.
источник
ALTER
. Когда ты это сделал? Для существующих таблиц вы должны иметьGRANT
права.Общедоступная схема должна быть видна всем пользователям. Вы не должны ограничивать права публичной схемы только одной группой.
Итак, если вы не используете:
Вы можете безопасно работать с общедоступной схемой со всеми учетными записями.
Если вы не хотите, чтобы определенные учетные записи портили таблицы общедоступных схем, создайте новую роль (для пользователей вашего приложения) и отзовите права для этой конкретной роли в общедоступной схеме. Что-то вроде:
Не наоборот, как вы пытаетесь это сделать.
источник
GRANT
Никогда не должны быть в состоянии уменьшить права доступа. Я не убежден. Обратите внимание, что права на схему также не наследуются новыми таблицами в этой схеме, поэтому наличие доступа кpublic
схеме не означает, что вы можете использовать таблицы внутри нее.