Sim, isso é factível.
"superusuário" pode ser um
superuser
real , postgres
por padrão. Eu renomeio a função para usuários simples para usr
, porque user
é uma palavra reservada - não a use como identificador. 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 você pode criar funções de daemon sem login para possuir as funções e manter os respectivos direitos na tabela. Isso seria ainda mais seguro.
Se você está indo por esse caminho, você vai amar
ALTER DEFAULT PRIVILEGES
(introduzido com o PostgreSQL 9.0). Mais detalhes nesta resposta relacionada
. Leia o capítulo Escrevendo
SECURITY DEFINER
Funciona com segurança
no manual.