Я хотел бы предоставить пользователю все разрешения на базу данных, не делая его администратором. Причина, по которой я хочу сделать это, заключается в том, что на данный момент DEV и PROD - это разные БД в одном кластере, поэтому я не хочу, чтобы пользователь мог изменять производственные объекты, но он должен иметь возможность изменять объекты на DEV.
Я пробовал:
grant ALL on database MY_DB to group MY_GROUP;
но он, похоже, не дает никакого разрешения.
Затем я попытался:
grant all privileges on schema MY_SCHEMA to group MY_GROUP;
и, похоже, мне разрешено создавать объекты, но не запрашивать\удалять объекты на этой схеме, принадлежащие другим пользователям
Я мог бы продолжить, предоставив пользователю разрешение на MY_SCHEMA, но потом он пожаловал бы о том, что не имеет прав на таблицу...
Итак, я думаю, мой вопрос: есть ли простой способ предоставить все разрешения пользователю в БД?
Я работаю над PostgreSQL 8.1.23.
Пользователю необходим доступ к базе данных, очевидно:
GRANT CONNECT ON DATABASE my_db TO my_user;
И (как минимум) привилегия USAGE
для схемы:
GRANT USAGE ON SCHEMA public TO my_user;
Затем все разрешения для всех таблиц (требуется Postgres 9.0 или более поздняя версия):
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO my_user;
И не забывайте последовательности (если есть):
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO my_user;
Для более старых версий вы можете использовать "Grant Wizard" из pgAdmin III (графический интерфейс по умолчанию).
Больше:
Но на самом деле, вы должны обновить до текущей версии.
GRANT ALL PRIVILEGES ON DATABASE "my_db" to my_user;
В PostgreSQL 9.0+ вы сделаете следующее:
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA MY_SCHEMA TO MY_GROUP;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA MY_SCHEMA TO MY_GROUP;
Если вы хотите включить это для вновь созданных отношений, установите для него разрешения по умолчанию:
ALTER DEFAULT PRIVILEGES IN SCHEMA MY_SCHEMA
GRANT ALL PRIVILEGES ON TABLES TO MY_GROUP;
ALTER DEFAULT PRIVILEGES IN SCHEMA MY_SCHEMA
GRANT ALL PRIVILEGES ON SEQUENCES TO MY_GROUP;
Однако, видя, что вы используете 8.1, вы должны сами его закодировать:
CREATE FUNCTION grant_all_in_schema (schname name, grant_to name) RETURNS integer AS $$
DECLARE
rel RECORD;
BEGIN
FOR rel IN
SELECT c.relname
FROM pg_class c
JOIN pg_namespace s ON c.namespace = s.oid
WHERE s.nspname = schname
LOOP
EXECUTE 'GRANT ALL PRIVILEGES ON ' || quote_ident(schname) || '.' || rel.relname || ' TO ' || quote_ident(grant_to);
END LOOP;
RETURN 1;
END; $$ LANGUAGE plpgsql STRICT;
REVOKE ALL ON FUNCTION grant_all_in_schema(name, name) FROM PUBLIC;
Это установит права на все отношения: таблицы, представления, индексы, последовательности и т.д. Если вы хотите ограничить это, отфильтруйте pg_class.relkind
. Подробнее см. pg_class.
Вы должны запустить эту функцию как суперпользователь и как обычно, как требуется вашему приложению. Параметр должен был бы упаковать это в задание cron, которое выполняется каждый день или каждый час.
Я сделал следующее, чтобы добавить роль 'eSumit' в базу данных PostgreSQL 9.4.15 и предоставить все разрешения для этой роли:
CREATE ROLE eSumit;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO eSumit;
GRANT ALL PRIVILEGES ON DATABASE "postgres" to eSumit;
ALTER USER eSumit WITH SUPERUSER;
Также проверил записи pg_table через:
выберите * из pg_roles;
Снимок запросов к базе данных: