Concepto básico en Postgres
Los roles son objetos globales que pueden acceder a todas las bases de datos en un clúster de base de datos, dados los privilegios requeridos.
Un clúster contiene muchas bases de datos , que contienen muchos esquemas . Los esquemas (incluso con el mismo nombre) en diferentes bases de datos no están relacionados. La concesión de privilegios para un esquema solo se aplica a este esquema en particular en la base de datos actual (la base de datos actual en el momento de la concesión).
Cada base de datos comienza con un esquema public
por defecto. Esa es una convención, y muchas configuraciones comienzan con ella. Aparte de eso, el esquema public
es solo un esquema como cualquier otro.
Viniendo de MySQL, es posible que desee comenzar con un esquema único public
, ignorando efectivamente la capa de esquema por completo. Estoy usando docenas de esquemas por base de datos regularmente.
Los esquemas son un poco (pero no completamente) como directorios en el sistema de archivos.
Una vez que haga uso de varios esquemas, asegúrese de comprender search_path
ajuste:
- ¿Cómo influye search_path en la resolución del identificador y el "esquema actual"?
Privilegios predeterminados
Por documentación en GRANT
:
PostgreSQL otorga privilegios predeterminados en algunos tipos de objetos a PUBLIC
. No se otorgan privilegios a PUBLIC
por defecto en tablas, columnas, esquemas o tablespaces. Para otros tipos, los privilegios predeterminados otorgados a PUBLIC
son los siguientes:CONNECT
y CREATE TEMP TABLE
para bases de datos; EXECUTE
privilegio para funciones; y USAGE
privilegio para idiomas.
Todos estos valores predeterminados se pueden cambiar con ALTER DEFAULT PRIVILEGES
:
- Otorgar todo en un esquema específico en la base de datos a un rol de grupo en PostgreSQL
Rol del grupo
Como comentó @Craig, es mejor GRANT
privilegios a un rol de grupo y luego haga que un usuario específico sea miembro de ese rol (GRANT
el rol de grupo al rol de usuario). De esta manera, es más sencillo distribuir y revocar paquetes de privilegios necesarios para ciertas tareas.
Un rol de grupo es solo otro rol sin inicio de sesión. Agregue un inicio de sesión para transformarlo en un rol de usuario. Más:
- ¿Por qué PostgreSQL fusionó usuarios y grupos en roles?
Roles predefinidos
Actualización: Postgres 14 o posterior agrega los nuevos roles predefinidos (formalmente "roles predeterminados") pg_read_all_data
y pg_write_all_data
para simplificar algunos de los siguientes. Ver:
- Otorgar acceso a todas las tablas de una base de datos
Receta
Digamos, tenemos una nueva base de datos mydb
, un grupo mygrp
y un usuario myusr
...
Mientras está conectado a la base de datos en cuestión como superusuario (postgres
por ejemplo):
REVOKE ALL ON DATABASE mydb FROM public; -- shut out the general public
GRANT CONNECT ON DATABASE mydb TO mygrp; -- since we revoked from public
GRANT USAGE ON SCHEMA public TO mygrp;
Para asignar "a un usuario todos los privilegios para todas las tablas" como escribiste (podría ser más restrictivo):
GRANT ALL ON ALL TABLES IN SCHEMA public TO mygrp;
GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO mygrp; -- don't forget those
Para establecer privilegios predeterminados para objetos futuros, ejecute para cada rol que crea objetos en este esquema:
ALTER DEFAULT PRIVILEGES FOR ROLE myusr IN SCHEMA public
GRANT ALL ON TABLES TO mygrp;
ALTER DEFAULT PRIVILEGES FOR ROLE myusr IN SCHEMA public
GRANT ALL ON SEQUENCES TO mygrp;
-- more roles?
Ahora, otorga el grupo al usuario:
GRANT mygrp TO myusr;
Respuesta relacionada:
- PostgreSQL:al usuario de base de datos solo se le debe permitir llamar a funciones
Configuración alternativa (no estándar)
Viniendo de MySQL, y dado que desea mantener los privilegios en las bases de datos separadas, es posible que le guste esta configuración no estándar db_user_namespace
. Por documentación:
Este parámetro habilita los nombres de usuario por base de datos. Está desactivado de forma predeterminada.
Lea el manual cuidadosamente. No uso esta configuración. No anula lo anterior.