Saltar al contenido

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

Te recomendamos que revises esta solución en un ambiente controlado antes de pasarlo a producción, un saludo.

Solución:

Todos los comandos deben ejecutarse mientras está conectado a la base de datos correcta en el clúster de base de datos correcto. Asegúrate de ello.

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

GRANT CONNECT ON DATABASE my_db TO my_user;

Y (al menos) el USAGE privilegio en el esquema:

GRANT USAGE ON SCHEMA public TO my_user;

O conceder USAGE sobre todo 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
$$;

Entonces, todos los permisos para todos mesas (requiere Postgres 9.0 o después).
y no olvides secuencias (Si alguna):

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 usar el “Asistente de subvenciones” de pgAdmin III (la GUI predeterminada).

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 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:

  • ¿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 las vistas a un usuario arbitrario

Considere actualizar a una versión actual.

GRANT ALL PRIVILEGES ON DATABASE "my_db" to my_user;

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 también desea habilitar esto 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, 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. Consulte los documentos de pg_class para obtener más detalles.

Debe ejecutar esta función como superusuario y con la regularidad que 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.

Recuerda algo, que te concedemos valorar este enunciado si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *