Надання доступу до всіх таблиць для користувача


151

Я новачок у Postgres і намагаюся перенести наші бази даних MySQL. В MySQL я можу надати SELECT, UPDATE, INSERTі DELETEпільги за низьким привілейованого користувачеві , і щоб ці гранти будуть застосовуватися до всіх таблиць у зазначеній базі даних. Мені, мабуть, щось не вистачає в Postgres, тому що, схоже, я повинен надавати ці привілеї для кожної таблиці по одному. З багатьма базами даних і сотнями таблиць на базу даних, це здається непростим завданням просто зійти з місця. Крім того, щойно база даних працює, додавання таблиць трапляється досить часто, що я не хотів би кожен раз надавати дозволи, якщо це абсолютно не потрібно.

Як це найкраще досягти?

Відповіді:


175

По-перше, ви повинні мати можливість підключитися до бази даних, щоб виконувати запити. Цього можна досягти шляхом

REVOKE CONNECT ON DATABASE your_database FROM PUBLIC;

GRANT CONNECT
ON DATABASE database_name 
TO user_name;

Це REVOKEнеобхідно, тому що

Ключове слово PUBLIC вказує на те, що пільги повинні надаватися всім ролям, включаючи ті, які можуть бути створені пізніше. PUBLIC можна розглядати як неявно визначену групу, яка завжди включає всі ролі. Будь-яка конкретна роль матиме суму привілеїв, наданих безпосередньо їй, привілеїв, наданих будь-якій ролі, в якій вона є членом, та привілеїв, наданих PUBLIC.

Якщо ви дійсно хочете обмежити свого користувача в операторах DML, то вам потрібно ще трохи зробити:

REVOKE ALL
ON ALL TABLES IN SCHEMA public 
FROM PUBLIC;

GRANT SELECT, INSERT, UPDATE, DELETE
ON ALL TABLES IN SCHEMA public 
TO user_name;

Вони передбачають, що у вас буде лише одна схема (яка за замовчуванням названа "public").

Як зазначав Джек Дуглас, вищесказане дає лише пільги для вже існуючих таблиць. Щоб досягти того ж для майбутніх таблиць, ви повинні визначити привілеї за замовчуванням :

ALTER DEFAULT PRIVILEGES 
    FOR ROLE some_role   -- Alternatively "FOR USER"
    IN SCHEMA public
    GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO user_name;

Тут some_roleє роль, яка створює таблиці, а user_nameтой, хто отримує привілеї. Визначаючи це, ви повинні увійти як some_roleабо його член.

І, нарешті, вам потрібно зробити те ж саме для послідовностей (завдяки PlaidFan за те, що він це вказав) - ось ця USAGEпривілей вам потрібна.


1
Спасибі, FOR some_roleбула ключовою частиною, якої мені не вистачало, щоб вона працювала для моїх таблиць, створених згодом. Але мені не потрібно було входити в систему як some_role, він працював також, якщо я виконував запит як користувач адміністратора за замовчуванням postgres.
JustAMartin

54

якщо ви хочете надати їм усі пільги - зробіть це:

grant all privileges on database dbname to dbuser;

де dbnameім'я вашої бази даних та dbuserім’я користувача.


44
Це додасть такі привілеї на бази даних : CREATE, CONNECT, TEMPORARY. На таблицях немає пільг.
дезсо

13
Аналогічна команда для всіх таблиць була бGRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO dbuser;
Dolan Antenucci

5
Я вважаю це також корисним:GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO dbuser;
Паоло

18

Надання всіх привілеїв усім таблицям в базі даних здійснюється за допомогою

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA <schema_name> TO <username>;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA <schema_name> TO <username>;

15

Можливо, я робив щось не так, оскільки я дуже новачок у PostgreSQL. Але це вирішило лише першу частину проблеми для мене - встановлення привілеїв для всіх існуючих таблиць.

Для того, щоб дозволу було правильно встановлено для мого користувача на нових створених таблицях, я повинен встановити дозволи користувача за замовчуванням:

ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT, INSERT, UPDATE, DELETE ON tables TO user_name;

ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT, USAGE ON sequences TO user_name;

2
--Create User

CREATE USER my_user_test WITH LOGIN NOSUPERUSER NOCREATEDB  NOCREATEROLE    INHERIT NOREPLICATION   CONNECTION LIMIT -1 PASSWORD 'xxxxxxx';

-- Grant connect to my data base

GRANT CONNECT ON DATABASE my_db_test TO my_user_test;

-- Grant usage the schema

GRANT USAGE ON SCHEMA my_sch_test TO my_user_test ;

-- Grant all table for SELECT, INSERT, UPDATE, DELETE

GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA my_sch_test TO my_user_test;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.