Надайте всі дозволи користувачу в БД


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;

і, здається, дає мені дозвіл на створення об'єктів, але не на запит \ видалення об'єктів на тій схемі, які належать іншим користувачам

Я можу продовжувати, надаючи користувачеві дозвіл на 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;

Для старих версій ви можете скористатися "майстром надання грантів" pgAdmin III (GUI за замовчуванням).

Є ще деякі об’єкти, у посібникуGRANT з повного списку станом на Postgres 12:

привілеї на об’єкт бази даних (таблиця, стовпець, подання, іноземна таблиця, послідовність, база даних, обгортка іноземних даних, іноземний сервер, функція, процедура, мова процедури, схема або простір таблиць)

Але решта потрібна рідко. Детальніше:

Розгляньте можливість оновлення до поточної версії .


133
GRANT ALL PRIVILEGES ON DATABASE "my_db" to my_user;

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 .

Ви повинні запускати цю функцію як надруковану та так само регулярну, як вимагає ваша програма. Важливим варіантом буде упаковка цього пакета в роботу, що виконується щодня або щогодини.


Привіт Патріку, "ВСІ ТАБЛИЦІ" недоступний на 8.1 ( postgresql.org/docs/8.1/static/sql-grant.html ) Я знаю, що я міг би переглядати таблиці і надавати дозволи окремо, але це те, що я намагаються уникати. але дякую за вашу допомогу
Дієго

@Diego: Додано рішення для 8.1
Патріка

спасибі Патріку, я в кінцевому підсумку використовував щось подібне до тебе, але не використовував "ВСЕ ВСЕ" Чомусь це, здається, нічого не робить. Для іспиту я побіг: надайте ВСЕ на тест схеми для користувачаA; але після цього користувач все ще не має доступу до читання з таблиць на тесті схеми
Дієго

2
Вам слід надати схему використання. Потім у всіх відносинах у межах цієї схеми (таблиці, представлення, послідовності, покажчики тощо) вам доведеться окремо ВИБІРАТИ, ВСТАВИТИ, ОНОВЛЮВАТИ, ВИДАЛИТИ, ВИДАЛИТИ, ТРУНКТАТИ. Схеми - це простори імен, стосунки - там, де розміщуються ваші дані.
Патрік

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;

Також перевірили enggtable ентерії за допомогою:

виберіть * з pg_roles; введіть тут опис зображення

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


У мене є версія Postgres 10.3, і вона видає помилку синтаксису, коли я використовую лапки навколо назви бази даних.
сайдід
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.