PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Предоставяне на привилегии за конкретна база данни в PostgreSQL

Основна концепция в 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 . По документация:

Този параметър позволява потребителски имена на база данни. Изключено е по подразбиране.

Прочетете внимателно ръководството. Не използвам тази настройка. Това не отменя горното.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgres:ГРЕШКА:кешираният план не трябва да променя типа резултат

  2. Вмъкнете изображение в базата данни на postgresql

  3. Извличане на месеца от дата в PostgreSQL

  4. Конфигурация на Puma Cluster на Heroku

  5. Функция LPAD() в PostgreSQL