GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;
El usuario de solo lectura puede conectarse, ver las tablas, pero cuando intenta hacer una selección simple obtiene:
ERROR: permission denied for relation mytable
SQL state: 42501
Esto está sucediendo en PostgreSQL 9.1
¿Que hice mal?
postgresql
sorin
fuente
fuente
Respuestas:
Aquí está la solución completa para PostgreSQL 9+, actualizada recientemente.
CREATE USER readonly WITH ENCRYPTED PASSWORD 'readonly'; GRANT USAGE ON SCHEMA public to readonly; ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly; -- repeat code below for each database: GRANT CONNECT ON DATABASE foo to readonly; \c foo ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly; --- this grants privileges on new tables generated in new database "foo" GRANT USAGE ON SCHEMA public to readonly; GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO readonly; GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;
Gracias a https://jamie.curle.io/creating-a-read-only-user-in-postgres/ por varios aspectos importantes
Si alguien encuentra un código más corto, y preferiblemente uno que pueda realizar esto para todas las bases de datos existentes, felicitaciones adicionales.
fuente
GRANT ALL
permiso de forma predeterminada al usuario de solo lectura?\ddp
. Debería mostrarse igual=r/
quegranting_user=r/readonly_user
para el acceso de solo lectura.Intenta agregar
GRANT USAGE ON SCHEMA public to readonly;
Probablemente no sabía que es necesario tener los permisos necesarios para un esquema para poder usar objetos en el esquema.
fuente
psql
comopostgres
usuario y hago obtener una respuesta adecuada,GRANT
. Aún así, cuando miro a la ACL en las tablas, solo veo otras dos cuentas, una es el propietario de la base de datosjirauser
y otra cuenta de solo lectura con el nombreqauser
. Pero mireadonly
no aparece ahí. Postgres es la versión 9.1 e incluso reinicié el servidor, todavía no pasa nada.Esto funcionó para mí:
Compruebe el rol actual en el que ha iniciado sesión mediante: SELECT CURRENT_USER, SESSION_USER;
Nota : debe coincidir con el propietario del esquema.
Esquema | Nombre | Tipo | Propietario
-------- + -------- + ------- + ----------
Si el propietario es diferente, otorgue todas las concesiones al rol de usuario actual desde el rol de administrador de la siguiente manera:
GRANT 'ROLE_OWNER' a 'CURRENT ROLENAME';
Luego intente ejecutar la consulta, le dará el resultado ya que ahora tiene acceso a todas las relaciones.
fuente
asegúrese de que su usuario tenga atributos en su función. por ejemplo:
postgres=# \du List of roles Role name | Attributes | Member of -----------+------------------------------------------------+----------- flux | | {} postgres | Superuser, Create role, Create DB, Replication | {}
después de realizar el siguiente comando:
postgres=# ALTER ROLE flux WITH Superuser; ALTER ROLE postgres=# \du List of roles Role name | Attributes | Member of -----------+------------------------------------------------+----------- flux | Superuser | {} postgres | Superuser, Create role, Create DB, Replication | {}
solucionó el problema.
vea el tutorial para roles y cosas aquí: https://www.digitalocean.com/community/tutorials/how-to-use-roles-and-manage-grant-permissions-in-postgresql-on-a-vps--2
fuente
ERROR: permission denied for relation mytable
Debe ejecutar la siguiente consulta:
GRANT ALL ON TABLE mytable TO myuser;
O si su error está en una vista, tal vez la tabla no tenga permiso, por lo que debe ejecutar la siguiente consulta:
GRANT ALL ON TABLE tbm_grupo TO myuser;
fuente
ALTER DROP DELETE
Ect. Para ese usuario ...