Privilegios Predeterminados
ALTER DEFAULT PRIVILEGES adjunta plantillas de concesión a objetos futuros creados por un rol específico en un esquema. Sin él, cada migración debe recordar las sentencias GRANT manuales.
Receta
-- Ejecutar como propietario de la migración (crea tablas en el despliegue)
ALTER DEFAULT PRIVILEGES FOR ROLE app_owner IN SCHEMA app
GRANT SELECT ON TABLES TO app_readers;
ALTER DEFAULT PRIVILEGES FOR ROLE app_owner IN SCHEMA app
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO app_writers;
ALTER DEFAULT PRIVILEGES FOR ROLE app_owner IN SCHEMA app
GRANT USAGE, SELECT ON SEQUENCES TO app_writers;Cuándo usar esto: Arranque de un nuevo esquema, incorporación de un nuevo rol de servicio o corrección de fallos recurrentes de "olvidé conceder" en el despliegue.
Ejemplo de Trabajo
CREATE ROLE app_owner NOLOGIN;
CREATE ROLE app_migrator LOGIN PASSWORD 'vault';
GRANT app_owner TO app_migrator;
CREATE SCHEMA app AUTHORIZATION app_owner;
ALTER DEFAULT PRIVILEGES FOR ROLE app_owner IN SCHEMA app
REVOKE ALL ON TABLES FROM PUBLIC;
ALTER DEFAULT PRIVILEGES FOR ROLE app_owner IN SCHEMA app
GRANT SELECT ON TABLES TO app_readers;
ALTER DEFAULT PRIVILEGES FOR ROLE app_owner IN SCHEMA app
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO app_writers;
-- La migración crea una nueva tabla - las concesiones se aplican automáticamente
SET ROLE app_owner;
CREATE TABLE app.orders (id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY);
RESET ROLE;
-- Verificar
SELECT grantee, privilege_type
FROM information_schema.table_privileges
WHERE table_schema = 'app' AND table_name = 'orders';Lo que esto demuestra:
FOR ROLE app_ownercoincide con el rol creador - detalle críticoREVOKE ALL FROM PUBLICen los predeterminados cierra el acceso público para las nuevas tablas- La nueva tabla
ordersya tiene las concesionesapp_readers/app_writers
Profundización
FOR ROLE Importa
-- Incorrecto: predeterminados solo para el usuario actual
ALTER DEFAULT PRIVILEGES IN SCHEMA app GRANT SELECT ON TABLES TO app_ro;
-- Correcto: predeterminados cuando app_owner crea objetos
ALTER DEFAULT PRIVILEGES FOR ROLE app_owner IN SCHEMA app
GRANT SELECT ON TABLES TO app_ro;- Los predeterminados se indexan por el rol creador del objeto, no solo por el propietario del esquema.
- El migrador de CI debe establecer consistentemente
SET ROLE app_ownero conectarse comoapp_ownera través deSET SESSION AUTHORIZATION(solo superusuario). - Listar los predeterminados configurados:
SELECT * FROM pg_default_acl;Tipos de Objetos
| Comando | Se aplica a |
|---|---|
ON TABLES | Tablas y vistas |
ON SEQUENCES | Secuencias de respaldo serial/identidad |
ON FUNCTIONS | Funciones y procedimientos |
ON TYPES | Dominios y tipos |
Las Concesiones Únicas Todavía Son Necesarias
-- Objetos existentes antes de que se establecieran los predeterminados
GRANT SELECT ON ALL TABLES IN SCHEMA app TO app_readers;ALTER DEFAULT PRIVILEGESno es retroactivo.- Los scripts de arranque de migración a menudo combinan
ALL TABLES+ALTER DEFAULT PRIVILEGES.
Trampas
FOR ROLEIncorrecto - El migrador se ejecuta comoapp_migratorpero los predeterminados se establecen paraapp_owner. Solución: Alinear el rol creador o agregar predeterminados para ambos.- Múltiples migradores - El usuario de Flyway frente al usuario de corrección en caliente humano crean objetos sin predeterminados. Solución: Un solo rol de migración en producción.
- Secuencias olvidadas - Las concesiones de tablas existen;
INSERTfalla ennextval. Solución: Privilegios predeterminados enSEQUENCEStambién. - Esquema creado por superusuario - Los predeterminados para
app_ownerno se aplican a las tablas creadas por el superusuario. Solución: Nunca crear tablas de aplicaciones como superusuario. - Pruebas solo en esquema vacío - Los predeterminados nunca se prueban hasta la segunda migración. Solución: CI crea dos tablas y afirma las concesiones.
Alternativas
| Alternativa | Usar cuando | No usar cuando |
|---|---|---|
| Conceder en cada archivo de migración | Políticas explícitas por tabla | Fácil olvidar secuencias |
| Disparador de eventos en DDL | Auditoría/concesión centralizada | El equipo carece de habilidad de mantenimiento de disparadores |
| Propietario = app_api (anti-patrón) | Nunca recomendado | Quieres el mínimo privilegio |
Preguntas Frecuentes
¿Reemplazar GRANT manual en migraciones?
Use predeterminados para tablas rutinarias; mantenga GRANT explícito para excepciones (nivel de columna, tablas sensibles).
¿Múltiples esquemas?
Repita ALTER DEFAULT PRIVILEGES por esquema o use un bucle de arranque en SQL.
¿Vistas y vistas materializadas?
Cubierto por ON TABLES. Los derechos de actualización en matviews necesitan consideración separada para el rol de actualización.
¿Cómo eliminar un predeterminado?
ALTER DEFAULT PRIVILEGES ... REVOKE ... refleja la sintaxis de concesión; inspeccione pg_default_acl antes de los cambios.
Relacionados
- Patrones GRANT/REVOKE - concesiones únicas en objetos existentes
- Conceptos Básicos de Migraciones - disciplina del rol de migración
- Mejores Prácticas de Permisos - la aplicación se conecta con el mínimo privilegio
Versiones de Stack: Esta página fue escrita para PostgreSQL 18.4 (estable 18, mantenimiento 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x, y PostGIS 3.5+.