postgresql - tipos - Dar todos los permisos a un usuario en una base de datos
tipos de usuarios en postgresql (4)
Me gustaría otorgarle a un usuario todos los permisos en una base de datos sin convertirlo en administrador. La razón por la que quiero hacer eso es que en este momento DEV y PROD son DB diferentes en el mismo clúster, por lo que no quiero que un usuario pueda cambiar objetos de producción, pero debe poder cambiar objetos en DEV.
Lo intenté:
grant ALL on database MY_DB to group MY_GROUP;
pero no parece dar ningún permiso.
Entonces probé:
grant all privileges on schema MY_SCHEMA to group MY_GROUP;
y parece que me da permiso para crear objetos pero no para consultar / eliminar objetos en ese esquema que pertenecen a otros usuarios
Podría seguir dando permiso de USAGE al usuario en MY_SCHEMA pero luego me quejaría de que no tengo permisos en la mesa ...
Así que supongo que mi pregunta es: ¿hay alguna forma fácil de otorgar todos los permisos a un usuario en un DB?
Estoy trabajando en PostgreSQL 8.1.23.
En PostgreSQL 9.0+, harías lo siguiente:
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA MY_SCHEMA TO MY_GROUP;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA MY_SCHEMA TO MY_GROUP;
Si también desea habilitar esto para relaciones recién creadas, establezca los permisos predeterminados:
ALTER DEFAULT PRIVILEGES IN SCHEMA MY_SCHEMA
GRANT ALL PRIVILEGES ON TABLES TO MY_GROUP;
ALTER DEFAULT PRIVILEGES IN SCHEMA MY_SCHEMA
GRANT ALL PRIVILEGES ON SEQUENCES TO MY_GROUP;
Sin embargo, dado que usa 8.1, debe codificarlo usted mismo:
CREATE FUNCTION grant_all_in_schema (schname name, grant_to name) RETURNS integer AS $$
DECLARE
rel RECORD;
BEGIN
FOR rel IN
SELECT c.relname
FROM pg_class c
JOIN pg_namespace s ON c.namespace = s.oid
WHERE s.nspname = schname
LOOP
EXECUTE ''GRANT ALL PRIVILEGES ON '' || quote_ident(schname) || ''.'' || rel.relname || '' TO '' || quote_ident(grant_to);
END LOOP;
RETURN 1;
END; $$ LANGUAGE plpgsql STRICT;
REVOKE ALL ON FUNCTION grant_all_in_schema(name, name) FROM PUBLIC;
Esto establecerá los privilegios en todas las relaciones: tablas, vistas, índices, secuencias, etc. Si desea restringir eso, filtre en pg_class.relkind
. Ver los documentos de pg_class para más detalles.
Debe ejecutar esta función como superusuario y tan regularmente como lo requiera su aplicación. Una opción sería empaquetar esto en un trabajo cron que se ejecuta todos los días o cada hora.
Hice lo siguiente para agregar un rol ''eSumit'' en la base de datos de PostgreSQL 9.4.15 y proporcionar todos los permisos para este rol:
CREATE ROLE eSumit;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO eSumit;
GRANT ALL PRIVILEGES ON DATABASE "postgres" to eSumit;
ALTER USER eSumit WITH SUPERUSER;
También verifiqué las enteros de pg_table a través de:
Necesita (al menos) el privilegio USAGE
en el esquema de cualquier manera.
Este comando DDL requiere Postgres 9.0 o posterior:
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO myuser;
Para versiones anteriores, puede usar el "Grant Wizard" de pgAdmin (la GUI predeterminada).
Más detalles:
- ¿Cómo gestionar PRIVILEGIOS PREDETERMINADOS para USUARIOS en una BASE DE DATOS frente a SCHEMA?
- Otorga privilegios para una base de datos particular en PostgreSQL
- Cómo otorgar todos los privilegios en vistas a usuarios arbitrarios
Pero realmente, debes actualizar a una versión actual .
GRANT ALL PRIVILEGES ON DATABASE "my_db" to my_user;