Dar todos los permisos a un usuario en una base de datos

206

Me gustaría dar 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 bases de datos 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 intenté:

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 continuar dando permiso a USAGE al usuario en MY_SCHEMA, pero luego se quejaría de no tener permisos sobre la mesa ...

Entonces, supongo que mi pregunta es: ¿hay alguna manera fácil de otorgar todos los permisos a un usuario en una base de datos?

Estoy trabajando en PostgreSQL 8.1.23.

Diego
fuente

Respuestas:

271

El usuario necesita acceso a la base de datos , obviamente:

GRANT CONNECT ON DATABASE my_db TO my_user;

Y (al menos) el USAGEprivilegio en el esquema :

GRANT USAGE ON SCHEMA public TO my_user;

O conceda USAGEen todos los esquemas personalizados:

DO
$$
BEGIN
   -- RAISE NOTICE '%', (  -- use instead of EXECUTE to see generated commands
   EXECUTE (
   SELECT string_agg(format('GRANT USAGE ON SCHEMA %I TO my_user', nspname), '; ')
   FROM   pg_namespace
   WHERE  nspname <> 'information_schema' -- exclude information schema and ...
   AND    nspname NOT LIKE 'pg\_%'        -- ... system schemas
   );
END
$$;

Luego, todos los permisos para todas las tablas (requiere Postgres 9.0 o posterior).
Y no olvide las secuencias (si las hay):

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO my_user;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO my_user;

Para versiones anteriores , puede utilizar el "Asistente de concesión" de pgAdmin III (la GUI predeterminada).

Hay algunos otros objetos, el manual paraGRANT tiene la lista completa a partir de Postgres 12:

privilegios en un objeto de base de datos (tabla, columna, vista, tabla externa, secuencia, base de datos, contenedor de datos externos, servidor externo, función, procedimiento, lenguaje de procedimiento, esquema o espacio de tabla)

Pero el resto rara vez se necesita. Más detalles:

Considere actualizar a una versión actual .

Erwin Brandstetter
fuente
133
GRANT ALL PRIVILEGES ON DATABASE "my_db" to my_user;
Unkas
fuente
24
Otorgar todos los privilegios ON DATABASEsuena poderoso, pero no hace mucho. Es solo un comienzo. No otorga ningún privilegio sobre los objetos contenidos.
Erwin Brandstetter
50

En PostgreSQL 9.0+ haría 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 desea habilitar esto también para las relaciones recién creadas, configure 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, al ver 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 pg_class.relkind. Ver los documentos de pg_class para más detalles.

Debe ejecutar esta función como superusuario y tan regular 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.

Patricio
fuente
Hola Patrick, "TODAS LAS TABLAS" no está disponible en 8.1 ( postgresql.org/docs/8.1/static/sql-grant.html ) Sé que podría recorrer las tablas y otorgar los permisos individualmente, pero esto es lo que estoy tratando de evitarlo pero gracias por tu ayuda
Diego
@Diego: solución agregada para 8.1
Patrick
gracias patrick, terminé usando algo como lo hiciste tú pero sin usar "OTORGAR TODO". Por alguna razón, no parece hacer nada. Por ejemplo, ejecuté: conceder TODO en la prueba de esquema al usuarioA; pero después de eso, el usuario A todavía no tiene acceso para leer de las tablas en la prueba de esquema
Diego
2
Debería OTORGAR EL USO en un esquema. Luego, en todas las relaciones dentro de ese esquema (tablas, vistas, secuencias, índices, etc.) debe CONCEDER SELECCIONAR, INSERTAR, ACTUALIZAR, BORRAR, TRUNCAR por separado. Los esquemas son espacios de nombres, las relaciones son donde se encuentran sus datos.
Patrick
28

Hice lo siguiente para agregar un rol 'eSumit' en la base de datos PostgreSQL 9.4.15 y otorgar 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 entradas de pg_table a través de:

seleccione * de pg_roles; ingrese la descripción de la imagen aquí

Instantánea de consultas de la base de datos: ingrese la descripción de la imagen aquí

Sumit Arora
fuente
Tengo la versión 10.3 de Postgres y arroja un error de sintaxis cuando uso comillas alrededor del nombre de la base de datos.
Sajid