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

206

Я хотел бы дать пользователю все разрешения для базы данных, не делая ее администратором. Причина, по которой я хочу сделать это, состоит в том, что в настоящий момент DEV и PROD являются разными БД в одном кластере, поэтому я не хочу, чтобы пользователь мог изменять производственные объекты, но он должен иметь возможность изменять объекты в DEV.

Я попытался:

grant ALL on database MY_DB to group MY_GROUP;

но это, похоже, не дает никакого разрешения.

Тогда я попробовал:

grant all privileges on schema MY_SCHEMA to group MY_GROUP;

и, кажется, дает мне разрешение создавать объекты, но не запрашивать \ удалять объекты в этой схеме, принадлежащие другим пользователям

Я мог бы продолжить, дав пользователю USAGE разрешение на MY_SCHEMA, но тогда он пожаловался бы на отсутствие разрешений для таблицы ...

Поэтому я предполагаю, что мой вопрос таков: есть ли простой способ предоставить все разрешения пользователю в БД?

Я работаю над PostgreSQL 8.1.23.

Диего
источник

Ответы:

271

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

GRANT CONNECT ON DATABASE my_db TO my_user;

И (как минимум) USAGEпривилегия на схеме :

GRANT USAGE ON SCHEMA public TO my_user;

Или предоставьте USAGEна всех пользовательских схемах:

DO
$$
BEGIN
   -- RAISE NOTICE '%', (  -- use instead of EXECUTE to see generated commands
   EXECUTE (
   SELECT string_agg(format('GRANT USAGE ON SCHEMA %I TO my_user', nspname), '; ')
   FROM   pg_namespace
   WHERE  nspname <> 'information_schema' -- exclude information schema and ...
   AND    nspname NOT LIKE 'pg\_%'        -- ... system schemas
   );
END
$$;

Затем все разрешения для всех таблиц (требуется 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 имеет полный список по состоянию на Postgres 12:

права доступа к объекту базы данных (таблица, столбец, представление, сторонняя таблица, последовательность, база данных, оболочка сторонних данных, сторонний сервер, функция, процедура, процедурный язык, схема или табличное пространство)

Но отдых редко нужен. Больше деталей:

Рассмотрите возможность обновления до текущей версии .

Эрвин Брандштеттер
источник
133
GRANT ALL PRIVILEGES ON DATABASE "my_db" to my_user;
Unkas
источник
24
Предоставление всех привилегий ON DATABASEзвучит мощно, но это мало что дает. Это только начало. Он не предоставляет никаких привилегий для содержащихся объектов.
Эрвин Брандштеттер
50

В 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 docs для деталей.

Вы должны запускать эту функцию с правами суперпользователя и настолько регулярно, насколько этого требует ваше приложение. Можно было бы упаковать это в задание cron, которое выполняется каждый день или каждый час.

Патрик
источник
Привет, Патрик, «ВСЕ ТАБЛИЦЫ» недоступны в 8.1 ( postgresql.org/docs/8.1/static/sql-grant.html ). Я знаю, что могу циклически проходить по таблицам и давать разрешения по отдельности, но это то, что я пытаясь избежать. но спасибо за вашу помощь
Диего
@Diego: добавлено решение для 8.1
Patrick
спасибо, Патрик, я закончил тем, что использовал то же, что и ты, но не использовал "GRANT ALL". По некоторым причинам это, кажется, ничего не делает. Например, я запустил: предоставить ВСЕ в тесте схемы пользователю А; но после этого у пользователя А все еще нет доступа к чтению из таблиц при проверке схемы
Диего
2
Вы должны предоставить использование схемы. Затем для всех отношений в этой схеме (таблиц, представлений, последовательностей, индексов и т. Д.) Необходимо выполнить GRANT SELECT, INSERT, UPDATE, DELETE, TRUNCATE отдельно. Схемы - это пространства имен, отношения - это место, где находятся ваши данные.
Патрик
28

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

База данных запросов снимок: введите описание изображения здесь

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