Podstawowa koncepcja w Postgresie
Role są obiektami globalnymi, które mogą uzyskiwać dostęp do wszystkich baz danych w klastrze db - z wymaganymi uprawnieniami.
klaster przechowuje wiele baz danych , które zawierają wiele schematów . Schematy (nawet o tej samej nazwie) w różnych bazach danych nie są powiązane. Nadawanie uprawnień do schematu dotyczy tylko tego konkretnego schematu w bieżącym DB (bieżącym DB w momencie nadawania).
Każda baza danych zaczyna się od schematu public
domyślnie. To konwencja i od niej zaczyna się wiele ustawień. Poza tym schemat public
to po prostu schemat jak każdy inny.
Pochodząc z MySQL, możesz zacząć od jednego schematu public
, skutecznie całkowicie ignorując warstwę schematu. Regularnie używam dziesiątek schematów na bazę danych.
Schematy są trochę (ale nie do końca) jak katalogi w systemie plików.
Gdy użyjesz wielu schematów, pamiętaj, aby zrozumieć search_path
ustawienie:
- W jaki sposób search_path wpływa na rozwiązywanie identyfikatorów i „bieżący schemat”
Uprawnienia domyślne
Zgodnie z dokumentacją dotyczącą GRANT
:
PostgreSQL nadaje domyślne uprawnienia do niektórych typów obiektów PUBLIC
. Żadne uprawnienia nie są przyznawane użytkownikowi PUBLIC
domyślnie w tabelach, kolumnach, schematach lub przestrzeniach tabel. W przypadku innych typów uprawnienia domyślne przyznawane PUBLIC
są następujące:CONNECT
i CREATE TEMP TABLE
dla baz danych; EXECUTE
uprawnienia do funkcji; i USAGE
przywilej dla języków.
Wszystkie te ustawienia domyślne można zmienić za pomocą ALTER DEFAULT PRIVILEGES
:
- Przyznaj wszystko w określonym schemacie w bazie danych do roli grupowej w PostgreSQL
Rola w grupie
Jak skomentował @Craig, najlepiej GRANT
przywileje do roli grupowej, a następnie nadaj określonemu użytkownikowi członkostwo w tej roli (GRANT
rolę grupową do roli użytkownika). W ten sposób łatwiej jest rozdawać i cofać pakiety uprawnień potrzebnych do niektórych zadań.
Rola grupowa to po prostu kolejna rola bez logowania. Dodaj login, aby przekształcić go w rolę użytkownika. Więcej:
- Dlaczego PostgreSQL połączył użytkowników i grupy w role?
Wstępnie zdefiniowane role
Aktualizacja: Postgres 14 lub nowszy dodaje nowe predefiniowane role (formalnie „role domyślne”) pg_read_all_data
i pg_write_all_data
aby uprościć niektóre z poniższych. Zobacz:
- Przyznaj dostęp do wszystkich tabel bazy danych
Przepis
Powiedzmy, że mamy nową bazę danych mydb
, grupa mygrp
i użytkownika myusr
...
Podczas połączenia z daną bazą danych jako superużytkownik (postgres
na przykład):
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;
Aby przypisać „użytkownikowi wszystkie uprawnienia do wszystkich tabel” tak jak napisałeś (mogę być bardziej restrykcyjny):
GRANT ALL ON ALL TABLES IN SCHEMA public TO mygrp;
GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO mygrp; -- don't forget those
Aby ustawić domyślne uprawnienia dla przyszłych obiektów, uruchom dla każdej roli który tworzy obiekty w tym schemacie:
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?
Teraz przydziel grupę użytkownikowi:
GRANT mygrp TO myusr;
Powiązana odpowiedź:
- PostgreSQL - użytkownik bazy danych powinien mieć możliwość wywoływania funkcji tylko
Alternatywne (niestandardowe) ustawienie
Pochodzące z MySQL, a ponieważ chcesz zachować oddzielne uprawnienia do baz danych, może ci się spodobać to niestandardowe ustawienie db_user_namespace
. Zgodnie z dokumentacją:
Ten parametr włącza nazwy użytkowników dla poszczególnych baz danych. Domyślnie jest wyłączone.
Przeczytaj uważnie instrukcję. Nie używam tego ustawienia. Nie unieważnia powyższego.