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.
REVOKE CREATE ON SCHEMA public FROM PUBLIC;
. Sin eso, el usuario "solo lectura" no podría modificar las tablas existentes, pero podría crear nuevas tablas en el esquema y agregar / eliminar datos de esas tablas.psql mydb
contrario la mayoría de estas manipulaciones no lo harían. Personalmente me llevó una cantidad considerable de tiempo resolverlo por mi cuenta. Espero que esto ayude a alguien.Tenga en cuenta que PostgreSQL 9.0 (hoy en pruebas beta) tendrá una forma simple de hacerlo :
fuente
Referencia tomada de este blog:
Script para crear usuario de solo lectura:
Asigne permiso a este usuario de solo lectura:
Asigne permisos para leer todas las tablas nuevas creadas en el futuro
fuente
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO Read_Only_User;
que también permitiría leer todas las tablas creadas en el mismo DB en el futuro.INSERT
s.GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA schema_name TO Read_Only_User;
GRANT ALL ON ALL SEQUENCES IN SCHEMA schema_name TO Read_Only_User
:?Aquí está la mejor manera que he encontrado para agregar usuarios de solo lectura (usando PostgreSQL 9.0 o más reciente):
Luego, inicie sesión en todas las máquinas relacionadas (maestro + esclavo (s) de lectura / espera (s), etc.) y ejecute:
fuente
Por defecto, los nuevos usuarios tendrán permiso para crear tablas. Si planea crear un usuario de solo lectura, esto probablemente no sea lo que desea.
Para crear un verdadero usuario de solo lectura con PostgreSQL 9.0+, ejecute los siguientes pasos:
Si su usuario de solo lectura no tiene permiso para enumerar tablas (es decir,
\d
no devuelve resultados), probablemente sea porque no tieneUSAGE
permisos para el esquema.USAGE
es un permiso que permite a los usuarios usar realmente los permisos que se les han asignado. ¿Cuál es el punto de esto? No estoy seguro. Arreglar:fuente
He creado un script conveniente para eso; pg_grant_read_to_db.sh . Este script otorga privilegios de solo lectura a un rol específico en todas las tablas, vistas y secuencias en un esquema de base de datos y los establece como predeterminados.
fuente
Leí todas las soluciones posibles, que están bien, si recuerdas conectarte a la base de datos antes de conceder las cosas;) ¡Gracias de todos modos a todas las demás soluciones!
crear usuario psql:
inicie psql cli y establezca una contraseña para el usuario creado:
conectarse a la base de datos de destino:
otorgue todos los privilegios necesarios:
alterar los privilegios predeterminados para objetivos db public shema:
fuente
Si su base de datos está en el esquema público, es fácil (esto supone que ya ha creado el
readonlyuser
)Si su base de datos está usando
customschema
, ejecute lo anterior pero agregue un comando más:fuente
La forma no directa de hacerlo sería otorgar select en cada tabla de la base de datos:
Puede automatizar eso generando sus declaraciones de concesión a partir de los metadatos de la base de datos.
fuente
fuente
Tomado de un enlace publicado en respuesta al enlace de despesz .
Postgres 9.x parece tener la capacidad de hacer lo que se solicita. Vea el párrafo Grant on Database Objects de:
http://www.postgresql.org/docs/current/interactive/sql-grant.html
Donde dice: "También hay una opción para otorgar privilegios a todos los objetos del mismo tipo dentro de uno o más esquemas. Actualmente, esta funcionalidad solo es compatible con tablas, secuencias y funciones (pero tenga en cuenta que TODAS LAS TABLAS se considera que incluye vistas) y tablas extranjeras) ".
Esta página también trata el uso de ROLES y un PRIVILEGIO llamado "TODOS LOS PRIVILEGIOS".
También se presenta información sobre cómo las funcionalidades GRANT se comparan con los estándares SQL.
fuente