PostgreSQL: otorgar todos los permisos a un usuario en una base de datos PostgreSQL
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.
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 PUBLIC
de 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
, DELETE
para todas las tablas, vistas y secuencias. Además USAGE
de esquemas. Podemos GRANT
ser 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 TRUNCATE
el EXECUTE
privilegio de funciones). El manual:
pg_read_all_data
Lea todos los datos (tablas, vistas, secuencias), como si tuviera
SELECT
derechos sobre esos objetos yUSAGE
derechos sobre todos los esquemas, incluso sin tenerlos explícitamente. Este rol no tiene el atributo de rolBYPASSRLS
establecido. Si se utiliza RLS, es posible que un administrador desee establecerBYPASSRLS
roles a los que estéGRANT
asignado este rol.
pg_write_all_data
Escriba todos los datos (tablas, vistas, secuencias), como si tuviera derechos
INSERT
,UPDATE
yDELETE
sobre esos objetos, yUSAGE
derechos sobre todos los esquemas, incluso sin tenerlos explícitamente. Este rol no tiene el atributo de rolBYPASSRLS
establecido. Si se utiliza RLS, es posible que un administrador desee establecerBYPASSRLS
roles a los que estéGRANT
asignado 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 USAGE
privilegio 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 public
ya no se otorga PUBLIC
. Quizás tú también quieras eso. O simplemente concédele ALL
a 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, IDENTITY
las columnas pueden reemplazar serial
columnas 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 .
GRANT ALL PRIVILEGES ON DATABASE "my_db" to my_user;