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ó.