Ja, das ist machbar.
"Superuser" könnte ein tatsächlicher superuser
sein , postgres
standardmäßig. Ich benenne die Rolle für einfache Benutzer in usr
um , weil user
ist ein reserviertes Wort - verwenden Sie es nicht als Bezeichner.
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;
Oder Sie können Daemon-Rollen ohne Anmeldung erstellen, um die Funktionen zu besitzen und die entsprechenden Rechte für die Tabelle zu halten. Das wäre noch sicherer.
Wenn Sie diesen Weg gehen, werden Sie lieben ALTER DEFAULT PRIVILEGES
(eingeführt mit PostgreSQL 9.0). Weitere Details in dieser zugehörigen Antwort
.
Lesen Sie das Kapitel Schreiben von SECURITY DEFINER
Funktioniert sicher
im Handbuch.