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

123

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

  • 1
    8.1 давно не поддерживается Вы должны обновить сейчас .
  • 0
    да, но, как я говорил @Erwin, не вариант.
Теги:
grant
postgresql-8.1

4 ответа

153

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

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

Больше:

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

  • 0
    спасибо Эрвин, но на самом деле я работаю над actian paraccel, который использует psql в бэкэнде, поэтому в данный момент обновление не вариант.
  • 6
    Это только дает доступ к таблицам. В Postgres есть много других типов объектов, к которым у пользователя все еще не будет доступа ...
87
GRANT ALL PRIVILEGES ON DATABASE "my_db" to my_user;
  • 0
    Один ниже лучше.
  • 2
    Размещение двойных кавычек вокруг имени базы данных не является обязательным.
Показать ещё 2 комментария
42

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

  • 0
    Привет, Патрик, «ВСЕ ТАБЛИЦЫ» недоступны в 8.1 ( postgresql.org/docs/8.1/static/sql-grant.html ). Я знаю, что могу циклически проходить по таблицам и давать разрешения по отдельности, но это то, что я пытаясь избежать. но спасибо за вашу помощь
  • 0
    @Diego: добавлено решение для 8.1
Показать ещё 2 комментария
13

Я сделал следующее, чтобы добавить роль '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; Изображение 5099

Снимок запросов к базе данных: Изображение 5100

  • 0
    У меня есть Postgres версии 10.3, и он выдает синтаксическую ошибку, когда я использую кавычки вокруг имени базы данных.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню