Ja, det kan lade sig gøre.
"superbruger" kunne være en faktisk superuser
, postgres
som standard. Jeg omdøber rollen for almindelige brugere til usr
, fordi user
er et reserveret ord - brug det ikke som identifikator.
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;
Eller du kan oprette dæmonroller uden login for at eje funktionerne og have de respektive rettigheder på bordet. Det ville være endnu mere sikkert.
Hvis du går denne rute, vil du elske ALTER DEFAULT PRIVILEGES
(introduceret med PostgreSQL 9.0). Flere detaljer i dette relaterede svar
.
Læs kapitlet Skrivning af SECURITY DEFINER
Fungerer sikkert
i manualen.