Tak, jest to wykonalne.
„superużytkownik” może być rzeczywistym superuser
, postgres
domyślnie.Zmieniam rolę dla zwykłych użytkowników na usr
, ponieważ user
jest słowem zastrzeżonym - nie używaj go jako identyfikatora.
CREATE ROLE usr;
CREATE ROLE poweruser;
GRANT usr TO poweruser; -- poweruser can do everything usr can.
CREATE ROLE bob PASSWORD <password>;
GRANT poweruser TO bob;
CREATE ROLE alice PASSWORD <password>;
GRANT usr TO alice;
REVOKE ALL ON SCHEMA x FROM public;
GRANT USAGE ON SCHEMA x TO usr;
REVOKE ALL ON TABLE x FROM public;
REVOKE ALL ON TABLE y FROM public;
CREATE FUNCTION
...
SECURITY DEFINER;
REVOKE ALL ON FUNCTION ... FROM public;
GRANT EXECUTE ON FUNCTION a TO usr;
GRANT EXECUTE ON FUNCTION b TO poweruser;
Możesz też utworzyć role demona bez loginu, aby posiadać funkcje i posiadać odpowiednie prawa w tabeli. To byłoby jeszcze bezpieczniejsze.
Jeśli wybierasz się tą trasą, pokochasz ALTER DEFAULT PRIVILEGES
(wprowadzony w PostgreSQL 9.0). Więcej szczegółów w tej powiązanej odpowiedzi
.
Przeczytaj rozdział Pisanie SECURITY DEFINER
Funkcjonuje bezpiecznie
w instrukcji.