Saltar al contenido

¿Cómo se crea un usuario de solo lectura en PostgreSQL?

Después de mucho trabajar ya encontramos la respuesta de esta cuestión que tantos usuarios de nuestro sitio presentan. Si tienes algún dato que aportar no dudes en dejar tu conocimiento.

Solución:

Otorgar uso/seleccionar a una sola tabla

Si solo otorga CONECTAR a una base de datos, el usuario puede conectarse pero no tiene otros privilegios. Debe otorgar USO en espacios de nombres (esquemas) y SELECCIONAR en tablas y vistas individualmente de esta manera:

GRANT CONNECT ON DATABASE mydb TO xxx;
-- This assumes you're actually connected to mydb..
GRANT USAGE ON SCHEMA public TO xxx;
GRANT SELECT ON mytable TO xxx;

Múltiples tablas/vistas (PostgreSQL 9.0+)

En las últimas versiones de PostgreSQL, puede otorgar permisos en todas las tablas/vistas/etc en el esquema usando un solo comando en lugar de tener que escribirlos uno por uno:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO xxx;

Esto solo afecta a las tablas que ya se han creado. Más poderosamente, puede tener automáticamente roles predeterminados asignados a nuevos objetos en el futuro:

ALTER DEFAULT PRIVILEGES IN SCHEMA public
   GRANT SELECT ON TABLES TO xxx;

Tenga en cuenta que, de forma predeterminada, esto solo afectará a los objetos (tablas) creados por el usuario que emitió este comando: aunque también se puede establecer en cualquier rol del que sea miembro el usuario que lo emitió. Sin embargo, no elige privilegios predeterminados para todos los roles de los que es miembro al crear nuevos objetos… por lo que todavía hay algunas tonterías. Si adopta el enfoque de que una base de datos tiene un rol de propietario y los cambios de esquema se realizan como ese rol de propietario, debe asignar privilegios predeterminados a ese rol de propietario. En mi humilde opinión, todo esto es un poco confuso y es posible que deba experimentar para llegar a un flujo de trabajo funcional.

Varias tablas/vistas (versiones de PostgreSQL anteriores a la 9.0)

Para evitar errores en cambios extensos de varias tablas, se recomienda utilizar el siguiente proceso ‘automático’ para generar los cambios requeridos GRANT SELECT a cada tabla/vista:

SELECT 'GRANT SELECT ON ' || relname || ' TO xxx;'
FROM pg_class JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace
WHERE nspname = 'public' AND relkind IN ('r', 'v', 'S');

Esto debería generar los comandos GRANT relevantes para GRANT SELECT en todas las tablas, vistas y secuencias en público, para copiar y pegar. Naturalmente, esto solo se aplicará a las tablas que ya se han creado.

Referencia tomada de este blog:

Script para crear un usuario de solo lectura:

CREATE ROLE Read_Only_User WITH LOGIN PASSWORD 'Test1234' 
NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION VALID UNTIL 'infinity';

Asigne permiso a este usuario de solo lectura:

GRANT CONNECT ON DATABASE YourDatabaseName TO Read_Only_User;
GRANT USAGE ON SCHEMA public TO Read_Only_User;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO Read_Only_User;
GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO Read_Only_User;

Asigne permisos para leer todas las tablas nuevas creadas en el futuro

ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO Read_Only_User;

Tenga en cuenta que PostgreSQL 9.0 (hoy en prueba beta) tendrá una forma sencilla de hacerlo:

test=> GRANT SELECT ON ALL TABLES IN SCHEMA public TO joeuser;

Acuérdate de que tienes la opción de añadir un enjuiciamiento .

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *