Primero, debe poder conectarse a la base de datos para ejecutar consultas. Esto se puede lograr mediante
REVOKE CONNECT ON DATABASE your_database FROM PUBLIC;
GRANT CONNECT
ON DATABASE database_name 
TO user_name;
El REVOKEes necesario porque
  La palabra clave PUBLIC indica que los privilegios se otorgarán a todos los roles, incluidos los que se puedan crear más adelante. PÚBLICO puede considerarse como un grupo definido implícitamente que siempre incluye todos los roles. Cualquier rol en particular tendrá la suma de privilegios otorgados directamente, privilegios otorgados a cualquier rol del que actualmente sea miembro y privilegios otorgados a PUBLIC.
Si realmente desea restringir a su usuario a las declaraciones DML, entonces tiene un poco más que hacer:
REVOKE ALL
ON ALL TABLES IN SCHEMA public 
FROM PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE
ON ALL TABLES IN SCHEMA public 
TO user_name;
Estos suponen que solo tendrá un esquema (que se denomina 'público' por defecto).
Como Jack Douglas señaló, lo anterior solo otorga los privilegios para las tablas ya existentes . Para lograr lo mismo para las tablas futuras, debe definir los privilegios predeterminados :
ALTER DEFAULT PRIVILEGES 
    FOR ROLE some_role   -- Alternatively "FOR USER"
    IN SCHEMA public
    GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO user_name;
Aquí, some_rolees un rol que crea las tablas, mientras que user_namees el que obtiene los privilegios. Para definir esto, debe iniciar sesión como some_rolemiembro de este.
Y, finalmente, debe hacer lo mismo para las secuencias (gracias a PlaidFan por señalarlo): aquí es el USAGEprivilegio que necesita.
                 
                
FOR some_rolefue la parte clave que me faltaba para que funcione para mis tablas creadas más tarde. Pero no tuve que iniciar sesión comosome_role, también funcionó si ejecuté la consulta como elpostgresusuario administrador predeterminado .suponiendo que desea darles todos los privilegios, haga esto:
donde
dbnameestá el nombre de su base de datos ydbuseres el nombre del usuario.fuente
CREATE, CONNECT, TEMPORARY. Sin privilegios en las mesas.GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO dbuser;GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO dbuser;La concesión de todos los privilegios a todas las tablas dentro de la base de datos se logra con
fuente
Puede ser que estaba haciendo algo mal aquí, ya que soy muy nuevo en PostgreSQL. Pero esto solo resolvió la primera parte del problema para mí: establecer los privilegios en todas las tablas existentes.
Para que los permisos se configuren correctamente para mi usuario en las tablas nuevas, que se crean, tengo que establecer permisos predeterminados para el usuario:
fuente
fuente