Sì, è fattibile.
"superutente" potrebbe essere un vero e proprio superuser
, postgres
per impostazione predefinita. Rinomino il ruolo per gli utenti semplici in usr
, perché user
è una parola riservata - non usarla come identificatore.
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;
Oppure potresti creare ruoli daemon senza login per possedere le funzioni e mantenere i rispettivi diritti sul tavolo. Sarebbe ancora più sicuro.
Se stai percorrendo questa strada, amerai ALTER DEFAULT PRIVILEGES
(introdotto con PostgreSQL 9.0). Maggiori dettagli in questa risposta correlata
.
Leggi il capitolo Scrivere SECURITY DEFINER
Funziona in sicurezza
nel manuale.