usuarios usuario tipos superusuario solo privilegios postgres permisos mostrar listar lectura eliminar datos dar crear administrar postgresql grant postgresql-8.1

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:

seleccione * de pg_roles;

Instantánea de consultas a la base de datos:


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:

Pero realmente, debes actualizar a una versión actual .


GRANT ALL PRIVILEGES ON DATABASE "my_db" to my_user;