Ejecuta esto conectado a la base de datos que quieras 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;
Si tiene más esquemas que "públicos", deberá agregarlos a los dos REVOKE ALL PRIVILEGES ON ALL ...
declaraciones.
No olvide que las funciones deben haber sido creadas con SECURITY DEFINER
o este usuario aún no podrá ejecutarlos, ya que el contenido de la función se ejecutará con los permisos de este usuario, en lugar del usuario que creó la función.
Ver:
CREATE FUNCTION
particularmenteSECURITY DEFINER
GRANT
tanto para agregar usuarios a roles como para asignar derechos de acceso a tablas, secuencias, etcREVOKE
CREATE ROLE