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 .suponiendo que desea darles todos los privilegios, haga esto:
donde
dbname
está el nombre de su base de datos ydbuser
es 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