По-перше, ви повинні мати можливість підключитися до бази даних, щоб виконувати запити. Цього можна досягти шляхом
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
привілей вам потрібна.
FOR some_role
була ключовою частиною, якої мені не вистачало, щоб вона працювала для моїх таблиць, створених згодом. Але мені не потрібно було входити в систему якsome_role
, він працював також, якщо я виконував запит як користувач адміністратора за замовчуваннямpostgres
.