PostgreSQL: otorgar todos los permisos a un usuario en una base de datos PostgreSQL

Resuelto Diego asked hace 10 años • 8 respuestas

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 esto 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 los objetos de producción, pero debe poder cambiar los 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 darme permiso para crear objetos pero no para consultar/eliminar objetos en ese esquema que pertenecen a otros usuarios

Podría continuar dando permiso de USO al usuario en MY_SCHEMA pero luego se quejaría de no tener permisos en 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 avatar Mar 18 '14 22:03 Diego
Aceptado

Todos los comandos deben ejecutarse mientras está conectado al clúster de base de datos correcto. Asegúrate de ello.

Los roles son objetos del clúster de base de datos . Todas las bases de datos del mismo clúster comparten el conjunto de roles definidos. Los privilegios se otorgan/revocan por base de datos/esquema/tabla, etc.

Un rol necesita acceso a la base de datos , obviamente. Eso se concede PUBLICde forma predeterminada. Demás:

GRANT CONNECT ON DATABASE my_db TO my_user;

Privilegios básicos para Postgres 14 o posterior

Postgres 14 agrega los roles predefinidos sin inicio de sesión pg_read_all_data/pg_write_all_data .
Tienen privilegios SELECT/ INSERT, UPDATE, DELETEpara todas las tablas, vistas y secuencias. Además USAGEde esquemas. Podemos GRANTser miembros en estos roles:

GRANT pg_read_all_data TO my_user;
GRANT pg_write_all_data TO my_user;

Esto cubre todos los comandos DML básicos (pero no DDL, ni algunos comandos especiales como TRUNCATEel EXECUTEprivilegio de funciones). El manual:

pg_read_all_data

Lea todos los datos (tablas, vistas, secuencias), como si tuviera SELECTderechos sobre esos objetos y USAGEderechos sobre todos los esquemas, incluso sin tenerlos explícitamente. Este rol no tiene el atributo de rol BYPASSRLSestablecido. Si se utiliza RLS, es posible que un administrador desee establecer BYPASSRLSroles a los que esté GRANTasignado este rol.

pg_write_all_data

Escriba todos los datos (tablas, vistas, secuencias), como si tuviera derechos INSERT, UPDATEy DELETEsobre esos objetos, y USAGEderechos sobre todos los esquemas, incluso sin tenerlos explícitamente. Este rol no tiene el atributo de rol BYPASSRLSestablecido. Si se utiliza RLS, es posible que un administrador desee establecer BYPASSRLSroles a los que esté GRANTasignado este rol.

Todos los privilegios sin utilizar roles predefinidos (cualquier versión de Postgres)

Los comandos deben ejecutarse mientras está conectado a la base de datos correcta. Asegúrate de ello.

El rol necesita (al menos) el USAGEprivilegio en el esquema . Nuevamente, si se le concede PUBLIC, está cubierto. Demás:

GRANT USAGE ON SCHEMA public TO my_user;

Para permitir también la creación de objetos, el rol necesita el CREATE privilegio. Con Postgres 15, la seguridad se ha reforzado y ese privilegio en el esquema predeterminado publicya no se otorga PUBLIC. Quizás tú también quieras eso. O simplemente concédele ALLa tu rol:

GRANT ALL ON SCHEMA public TO my_user;

O conceder USAGE// en todosCREATE los esquemas personalizados:ALL

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
   -- SELECT string_agg(format('GRANT ALL   ON SCHEMA %I TO my_user', nspname), '; ')
   WHERE  nspname <> 'information_schema' -- exclude information schema and ...
   AND    nspname NOT LIKE 'pg\_%'        -- ... system schemas
   );
END
$$;

Luego todos los permisos para todas las tablas . Y no olvide las secuenciasserial (si las hay), que se utilizan para columnas heredadas .

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

Desde Postgres 10, IDENTITYlas columnas pueden reemplazar serialcolumnas y no necesitan privilegios separados para la secuencia involucrada. Ver:

  • Columna de tabla de incremento automático

Alternativamente, puede utilizar el "Asistente de concesión" de pgAdmin 4 para trabajar con una GUI.

Esto cubre privilegios para objetos existentes . Para cubrir también objetos futuros, establezca DEFAULT PRIVILEGES. Ver:

  • Otorgar privilegios para una base de datos particular en PostgreSQL
  • ¿Cómo administrar PRIVILEGIOS PREDETERMINADOS para USUARIOS en una BASE DE DATOS versus ESQUEMA?

Hay algunos otros objetos, el manualGRANT tiene la lista completa. A partir de Postgres 14:

privilegios sobre 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 es necesario. Más detalles:

  • Otorgar privilegios para una base de datos particular en PostgreSQL
  • Cómo otorgar todos los privilegios sobre vistas a un usuario arbitrario

Considere actualizar a una versión actual .

Erwin Brandstetter avatar Mar 18 '2014 16:03 Erwin Brandstetter
GRANT ALL PRIVILEGES ON DATABASE "my_db" to my_user;
Unkas avatar Jan 09 '2017 20:01 Unkas