Oui, c'est faisable.
"superutilisateur" pourrait être un véritable superuser
, postgres
par défaut.Je renomme le rôle pour les utilisateurs ordinaires en usr
, car user
est un mot réservé - ne l'utilisez pas comme identifiant.
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;
Ou vous pouvez créer des rôles de démon sans connexion pour posséder les fonctions et détenir les droits respectifs sur la table. Ce serait encore plus sûr.
Si vous suivez cette voie, vous allez adorer ALTER DEFAULT PRIVILEGES
(introduit avec PostgreSQL 9.0). Plus de détails dans cette réponse associée
.
Lire le chapitre Ecrire SECURITY DEFINER
Fonctionne en toute sécurité
dans le manuel.