Conceder uso / seleccionar a una sola tabla
Si solo concede CONNECT a una base de datos, el usuario puede conectarse pero no tiene otros privilegios. Debe otorgar USAGE en espacios de nombres (esquemas) y SELECT en tablas y vistas individualmente de la siguiente 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 utilizando 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 manera 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 emisor. Sin embargo, no obtienes privilegios predeterminados para todos los roles de los que eres miembro al crear nuevos objetos ... por lo que todavía hay algunas dudas. Si adopta el enfoque de que una base de datos tiene un rol propietario, y los cambios de esquema se realizan como ese rol propietario, entonces debe asignar privilegios predeterminados a ese rol propietario. En mi humilde opinión, todo esto es un poco confuso y es posible que deba experimentar para obtener un flujo de trabajo funcional.
Múltiples tablas / vistas (versiones de PostgreSQL anteriores a 9.0)
Para evitar errores en los largos cambios de varias tablas, se recomienda utilizar el siguiente proceso 'automático' para generar lo requerido GRANT SELECT
para 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 amor. Naturalmente, esto solo se aplicará a las tablas que ya se han creado.