Всички команди трябва да се изпълняват, докато са свързани към правилния клъстер на базата данни. Уверете се в това.
Ролите са обекти на клъстер на базата данни . Всички бази данни от един и същ клъстер споделят набора от дефинирани роли. Привилегиите се предоставят/отменят за база данни/схема/таблица и т.н.
Ролята се нуждае от достъп до базата данни , очевидно. Това е предоставено на PUBLIC по подразбиране. Друго:
GRANT CONNECT ON DATABASE my_db TO my_user;
Основни привилегии за Postgres 14 или по-нова версия
Postgres 14 добавя предварително дефинирани роли без влизане pg_read_all_data / pg_write_all_data .
Те имат SELECT / INSERT , UPDATE , DELETE привилегии за всички таблици, изгледи и последователности. Плюс USAGE на схеми. Можем да GRANT членство в тези роли:
GRANT pg_read_all_data TO my_user;
GRANT pg_write_all_data TO my_user;
Това обхваща всички основни DML команди (но не DDL, а не някои специални команди като TRUNCATE или EXECUTE привилегия за функции!). Ръководството:
pg_read_all_dataПрочетете всички данни (таблици, изгледи, последователности), сякаш имате
SELECTправа върху тези обекти иUSAGEправа върху всички схеми, дори и без това изрично. Тази роля няма атрибута на ролятаBYPASSRLSкомплект. Ако се използва RLS, администраторът може да пожелае да зададеBYPASSRLSза ролите, които тази роля еGRANTизд. до.
pg_write_all_dataНапишете всички данни (таблици, изгледи, последователности), сякаш имате
INSERT,UPDATEиDELETEправа върху тези обекти иUSAGEправа върху всички схеми, дори без да го има изрично. Тази роля няма атрибута на ролятаBYPASSRLSкомплект. Ако се използва RLS, администраторът може да пожелае да зададеBYPASSRLSза ролите, които тази роля еGRANTизд. до.
Всички привилегии без използване на предварително дефинирани роли (всяка версия на Postgres)
Командите трябва да се изпълняват, докато са свързани с правилната база данни. Уверете се в това.
Ролята се нуждае (поне) от USAGE привилегия върху схемата . Отново, ако това е предоставено на PUBLIC , покрити сте. Друго:
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 4, за да работите с GUI.
Има някои други обекти, ръководството за GRANT има пълния списък. От Postgres 12:
привилегии върху обект на база данни (таблица, колона, изглед, чужда таблица, последователност, база данни, обвивка на чужди данни, чужд сървър, функция, процедура, процедурен език, схема или пространство за таблици)
Но останалото рядко е необходимо. Повече подробности:
- Как да управлявам ПРАВИЛЕГИИТЕ ПО ПОДРАЗБИРАНЕ за ПОТРЕБИТЕЛИ на БАЗА ДАННИ спрямо SCHEMA?
- Дайте привилегии за конкретна база данни в PostgreSQL
- Как да предоставим всички привилегии за изгледи на произволен потребител
Помислете за надграждане до текуща версия.