Execute isso conectado ao banco de dados que você deseja configurar.
-- Create the user.
CREATE ROLE somebody WITH LOGIN PASSWORD '...';
-- Prevent all authenticated users from being able to use the database,
-- unless they have been explicitly granted permission.
REVOKE ALL PRIVILEGES ON DATABASE foo FROM PUBLIC;
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM PUBLIC;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM PUBLIC;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM PUBLIC;
-- Allow the user to only use the specified functions.
GRANT CONNECT ON DATABASE foo TO somebody;
GRANT EXECUTE ON FUNCTION return_customers(), return_time() TO somebody;
Se você tiver mais esquemas do que "público", precisará adicioná-los aos dois
REVOKE ALL PRIVILEGES ON ALL ...
declarações. Não esqueça que as funções devem ter sido criadas com
SECURITY DEFINER
ou este usuário ainda não poderá executá-los, pois o conteúdo da função será executado com as permissões deste usuário, ao invés do usuário que criou a função. Ver:
CREATE FUNCTION
particularmenteSECURITY DEFINER
GRANT
tanto para adicionar usuários a funções quanto para atribuir direitos de acesso a tabelas, sequências etc.REVOKE
CREATE ROLE