Ja, det här är genomförbart.
"superanvändare" kan vara en verklig superuser
, postgres
som standard. Jag byter namn på rollen för vanliga användare till usr
, eftersom user
är ett reserverat ord - använd det inte som identifierare.
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 så kan du skapa demonroller utan inloggning för att äga funktionerna och ha respektive rättigheter på bordet. Det skulle vara ännu säkrare.
Om du går den här vägen kommer du att älska ALTER DEFAULT PRIVILEGES
(introducerad med PostgreSQL 9.0). Mer information i det här relaterade svaret
.
Läs kapitlet Att skriva SECURITY DEFINER
Fungerar säkert
i manualen.