Подтвердить что ты не робот

Предоставить все разрешения пользователю на БД

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

4b9b3361

Ответ 1

Пользователю необходим доступ к базе данных, очевидно:

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 (графический интерфейс по умолчанию).

Больше:

Но на самом деле, вы должны обновить до текущей версии.

Ответ 2

GRANT ALL PRIVILEGES ON DATABASE "my_db" to my_user;

Ответ 3

В 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, которое выполняется каждый день или каждый час.

Ответ 4

Я сделал следующее, чтобы добавить роль '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; enter image description here

Снимок запросов к базе данных: enter image description here