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 ALLpermiso de forma predeterminada al usuario de solo lectura?\ddp. Debería mostrarse igual=r/quegranting_user=r/readonly_userpara 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
psqlcomopostgresusuario 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 datosjirausery otra cuenta de solo lectura con el nombreqauser. Pero mireadonlyno 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 mytableDebe 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 DELETEEct. Para ese usuario ...