usuarios usuario tipos superusuario postgres permisos listar datos dar crear crea como security postgresql permissions database-permissions

security - tipos - listar usuarios postgres



¿Cómo crear un usuario con privilegios de solo lectura para todas las bases de datos en Postgresql? (4)

Quiero crear un usuario con solo privilegios de selección para todas las tablas en todas las bases de datos. Pensé que podía obtener una lista de bases de datos y aplicar el siguiente comando para cada base de datos:

GRANT select ON DATABASE dbname to user1;

Pero tengo el siguiente error:

ERROR: invalid privilege type SELECT for database

Cuando busqué en Google, se me recomendó a la gente que hiciera la operación de grant select para todas las tablas. Pero siempre se están agregando nuevas tablas. Así que esta no es una solución aceptable para mí. ¿Alguien sabe alguna solución?


Debe hacer 2 cosas: en primer lugar, permitir el acceso a objetos existentes; y en segundo lugar, establezca el acceso predeterminado para los nuevos objetos creados a partir de ahora.

Tenga en cuenta que otorgar acceso a "TABLAS" incluye vistas, pero no incluye secuencias (como la función de incremento automático para las columnas "SERIE"), por lo que probablemente también desee otorgar acceso a esas.

Lo siguiente asume que desea hacer todo en el esquema public . La declaración ALTER DEFAULT PRIVILEGES puede actuar en toda la base de datos al omitir la cláusula IN SCHEMA ... ; El GRANT se debe ejecutar una vez para cada esquema.

-- Grant access to current tables and views GRANT SELECT ON ALL TABLES IN SCHEMA public TO user1; -- Now make sure that''s also available on new tables and views by default ALTER DEFAULT PRIVILEGES IN SCHEMA public -- omit this line to make a default across all schemas GRANT SELECT ON TABLES TO user1; -- Now do the same for sequences GRANT SELECT, USAGE ON ALL SEQUENCES IN SCHEMA public TO user1; ALTER DEFAULT PRIVILEGES IN SCHEMA public -- omit this line to make a default across all schemas GRANT SELECT, USAGE ON SEQUENCES TO user1;

Manual de PostgreSQL


Me doy cuenta de que ya has dicho que esta no es una respuesta aceptable, pero de todos modos es la respuesta correcta.

La especificación de la seguridad (GRANT y REVOKE) forma parte del diseño y las pruebas de la tabla.

No mueva las tablas a producción antes de que las definiciones de tabla, seguridad, pruebas y datos de prueba estén bajo el control de la versión.

Dicho esto, PostgreSQL no tiene permisos SELECT en bases de datos. Solo puede otorgar permisos CREAR, CONECTAR o TEMP en bases de datos.

Puede otorgar SELECT en todas las tablas en un esquema dado. No sé cómo afecta eso a las tablas creadas después de ejecutar la instrucción GRANT, pero es bastante fácil de probar.

Sintaxis de PostgreSQL Grant


No puede hacer esto en el nivel de la base de datos, solo en el nivel de esquema.

Suponiendo que solo está utilizando el esquema public en cada base de datos, puede hacer esto:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO user1; ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO user;


Para versiones de Postgres inferiores a 9.0:

psql -d DBNAME -qAt -c "SELECT ''GRANT SELECT ON '' || tablename || '' TO USER;'' FROM pg_tables WHERE schemaname = ''public''" | psql -d DBNAME psql -d DBNAME -qAt -c "SELECT ''GRANT SELECT ON '' || viewname || '' TO USER;'' FROM pg_views WHERE schemaname = ''public''" | psql -d DBNAME psql -d DBNAME -qAt -c "SELECT ''GRANT SELECT ON '' || relname || '' TO USER;'' FROM pg_statio_all_sequences WHERE schemaname = ''public''" | psql -d DBNAME