2011-06-23 80 views
16

Quiero crear un usuario con solo privilegios de selección para todas las tablas en todas las bases de datos. Pensé que podría conseguir una lista de bases de datos y aplicar el siguiente comando para cada base de datos:¿Cómo crear un usuario con privilegios de solo lectura para todas las bases de datos en Postgresql?

GRANT select ON DATABASE dbname to user1; 

Pero tengo el siguiente error:

ERROR: invalid privilege type SELECT for database 

Cuando busqué en Google la gente aconseja hacer la operación grant select para todas las tablas. Pero las nuevas tablas se agregan siempre. Entonces esta no es una solución aceptable para mí. ¿Alguien sabe alguna solución alternativa?

+0

@Jonas en realidad este es SQL básico, por lo que no una buena opción para DBA - http: //dba.stackexchange.com/faq – Stefano

Respuesta

17

No se puede hacer esto en el nivel de base de datos, sólo en el nivel de esquema.

Suponiendo que sólo se está utilizando el esquema public en cada base de datos, se 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; 
+2

Su afirmación de que esto se aplicará a las tablas y vistas recién creadas es incorrecta: "TODAS LAS TABLAS" es simplemente abreviado para ejecutar una SELECCIÓN DE GRANJOS en cada tabla existente y no establece ningún valor predeterminado. Para establecer el valor predeterminado para los objetos nuevos, necesita el comando ALTER DEFAULT PRIVILEGES: http://www.postgresql.org/docs/current/static/sql-alterdefaultprivileges.html (Consulte mi respuesta a continuación) – IMSoP

+0

@IMSoP: gracias por señalar ¡que fuera! –

+0

La pregunta original era sobre el tema de SELECt para todas las tablas y para TODAS las bases de datos. Esto es posible en mysql pero (creo) no es posible en postgres. En Postgres uno debe otorgar estos derechos para cada base de datos de forma independiente. Quizás pueda agregar esto como una aclaración (o corregirme si es posible). – Michael

4

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

La especificación de seguridad (GRANT y REVOKE) es parte del diseño y la prueba de la tabla.

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

Habiendo dicho eso, PostgreSQL no tiene ningún permiso SELECTO en las bases de datos. Puede otorgar solo permisos CREATE, CONNECT 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 declaración GRANT, pero es bastante fácil de probar.

PostgreSQL Grant syntax

21

que tiene que hacer 2 cosas: en primer lugar, permitir el acceso a los objetos existentes; y en segundo lugar, establecer 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 columnas "SERIE"), por lo que probablemente también desee otorgar acceso a ellas.

A continuación se supone que desea hacer todo lo posible en el esquema public. La instrucció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

+0

, curiosamente, necesité 'grant usage on schema public to user1;' así como –

3

Para las 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 
+0

tuve que hacer 'psql -d DBNAME -qAt -c" SELECT 'GRANT SELECT ON '|| relname ||' TO USER; ' FROM pg_statio_all_tables DONDE schemaname = 'public' "| psql -d DBNAME' aún – tymik

Cuestiones relacionadas