Основна концепция в Postgres
Ролите са глобални обекти, които могат да осъществяват достъп до всички бази данни в клъстер от db – при необходимите привилегии.
Клъстер съдържа много бази данни , които съдържат много схеми . Схемите (дори с едно и също име) в различни БД не са свързани. Предоставянето на привилегии за схема се прилага само за тази конкретна схема в текущата БД (текущата БД към момента на предоставяне).
Всяка база данни започва със схема public
по подразбиране. Това е конвенция и много настройки започват с него. Освен това, схемата public
е просто схема като всяка друга.
Идвайки от MySQL, може да искате да започнете с една схема public
, като ефективно игнорира напълно слоя на схемата. Използвам десетки схеми на база данни редовно.
Схемите са малко (но не напълно) като директории във файловата система.
След като използвате множество схеми, не забравяйте да разберете search_path
настройка:
- Как search_path влияе върху разделителната способност на идентификатора и „текущата схема“
Привилегии по подразбиране
Според документация за GRANT
:
PostgreSQL предоставя привилегии по подразбиране за някои типове обекти на
PUBLIC
. Не се предоставят привилегии наPUBLIC
по подразбиране на таблици, колони, схеми или пространства за таблици. За други типове привилегиите по подразбиране, предоставени наPUBLIC
са както следва:CONNECT
иCREATE TEMP TABLE
за бази данни;EXECUTE
привилегия за функции; иUSAGE
привилегия за езици.
Всички тези настройки по подразбиране могат да бъдат променени с ALTER DEFAULT PRIVILEGES
:
- Предоставете всички по конкретна схема в db на групова роля в PostgreSQL
Групова роля
Както коментира @Craig, най-добре е да GRANT
привилегии на групова роля и след това направете конкретен потребител член на тази роля (GRANT
ролята на групата към ролята на потребител). По този начин е по-лесно да се разпределят и отнемат пакети от привилегии, необходими за определени задачи.
Груповата роля е просто друга роля без вход. Добавете потребителско име, за да го трансформирате в потребителска роля. Още:
- Защо PostgreSQL обедини потребители и групи в роли?
Предварително дефинирани роли
Актуализация: Postgres 14 или по-нова версия добавя новите предварително дефинирани роли (формално "роли по подразбиране") pg_read_all_data
и pg_write_all_data
за опростяване на някои от изброените по-долу. Вижте:
- Предоставете достъп до всички таблици на база данни
Рецепта
Да речем, имаме нова база данни mydb
, група mygrp
и потребител myusr
...
Докато е свързан към въпросната база данни като суперпотребител (postgres
например):
REVOKE ALL ON DATABASE mydb FROM public; -- shut out the general public
GRANT CONNECT ON DATABASE mydb TO mygrp; -- since we revoked from public
GRANT USAGE ON SCHEMA public TO mygrp;
За да присвоите „на потребител всички привилегии към всички таблици“ както написахте (може би съм по-ограничителен):
GRANT ALL ON ALL TABLES IN SCHEMA public TO mygrp;
GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO mygrp; -- don't forget those
За да зададете привилегии по подразбиране за бъдещи обекти, стартирайте за всяка роля който създава обекти в тази схема:
ALTER DEFAULT PRIVILEGES FOR ROLE myusr IN SCHEMA public
GRANT ALL ON TABLES TO mygrp;
ALTER DEFAULT PRIVILEGES FOR ROLE myusr IN SCHEMA public
GRANT ALL ON SEQUENCES TO mygrp;
-- more roles?
Сега предоставете групата на потребителя:
GRANT mygrp TO myusr;
Свързан отговор:
- PostgreSQL – потребителят на DB трябва да има право да извиква само функции
Алтернативна (нестандартна) настройка
Идвайки от MySQL и тъй като искате да запазите привилегиите в базите данни разделени, може да ви хареса тази нестандартна настройка db_user_namespace
. По документация:
Този параметър позволява потребителски имена на база данни. Изключено е по подразбиране.
Прочетете внимателно ръководството. Не използвам тази настройка. Това не отменя горното.