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 REVOKE
es 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_role
es un rol que crea las tablas, mientras que user_name
es el que obtiene los privilegios. Para definir esto, debe iniciar sesión como some_role
miembro de este.
Y, finalmente, debe hacer lo mismo para las secuencias (gracias a PlaidFan por señalarlo): aquí es el USAGE
privilegio que necesita.
FOR some_role
fue 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 elpostgres
usuario administrador predeterminado .