sql >> Base de Datos >  >> RDS >> PostgreSQL

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

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

Los roles son objetos de la base de datos cluster . 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 a PUBLIC por defecto. Má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 SELECT / INSERT , UPDATE , DELETE privilegios para todos tablas, vistas y secuencias. Más USAGE en esquemas. Podemos GRANT membresía 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, y no algunos comandos especiales como TRUNCATE o el EXECUTE privilegio para las funciones!). El manual:

pg_read_all_data

Lea todos los datos (tablas, vistas, secuencias), como si tuviera SELECT derechos sobre esos objetos, y USAGE derechos sobre todos los esquemas, incluso sin tenerlos explícitamente. Este rol no tiene el atributo de rol BYPASSRLS colocar. Si se está utilizando RLS, un administrador puede desear configurar BYPASSRLS en funciones en las que esta función es GRANT enviado a.

pg_write_all_data

Escriba todos los datos (tablas, vistas, secuencias), como si tuviera INSERT ,UPDATE y DELETE derechos sobre esos objetos, y USAGE derechos sobre todos los esquemas, incluso sin tenerlo de forma explícita. Este rol no tiene el atributo de rol BYPASSRLS colocar. Si se utiliza RLS, un administrador puede desear configurar BYPASSRLS en los roles en los que este rol es GRANT enviado a.

Todos los privilegios sin usar 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 USAGE privilegio en el esquema . Nuevamente, si eso se otorga a PUBLIC , estás cubierto. Más:

GRANT USAGE ON SCHEMA public TO my_user;

O otorgar USAGE en todos 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 corresponde):

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

Alternativamente, puede usar el "Asistente de subvenciones" de pgAdmin 4 para trabajar con una GUI.

Hay algunos otros objetos, el manual para GRANT tiene la lista completa. A partir de Postgres 12:

privilegios en un objeto de base de datos (tabla, columna, vista, tabla foránea, secuencia, base de datos, envoltorio de datos foráneos, servidor foráneo, función, procedimiento, lenguaje de procedimiento, esquema o espacio de tabla)

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

  • ¿Cómo administrar PRIVILEGIOS POR DEFECTO para USUARIOS en una BASE DE DATOS vs ESQUEMA?
  • Otorgar privilegios para una base de datos en particular en PostgreSQL
  • Cómo otorgar todos los privilegios en vistas a usuarios arbitrarios

Considere actualizar a una versión actual.