Appearance
01_roles.sql
Objetivo
Crear (o asegurar la existencia de) los roles necesarios para un módulo determinado, incluyendo su variante LITE.
Este script:
- NO crea módulos.
- NO crea acciones.
- NO asigna permisos.
Solo define los perfiles (roles) a nivel sistema.
Concepto clave
roles.codigo es la clave humana y estable.
- Es lo que se usa en scripts posteriores.
- Es lo que se referencia en la lógica.
- Los UUIDs son internos y nunca se hardcodean.
Patrón recomendado
Por cada módulo funcional:
- Un rol FULL (acceso completo).
- Un rol LITE (acceso reducido, luego recortado).
Ejemplos reales del sistema:
- CARRERA_GESTION / CARRERA_GESTION_LITE
- CURSOS_GESTION / CURSOS_GESTION_LITE
- TRAMOS_GESTION / TRAMOS_GESTION_LITE
Idempotencia
- Si el rol ya existe (mismo
codigo), no se duplica. - Puede ejecutarse múltiples veces sin efectos adversos.
Script completo
sql
-- ============================================================
-- 01_roles.sql
-- ============================================================
-- OBJETIVO
-- --------
-- Crear (o asegurar la existencia de) los roles necesarios
-- para un módulo determinado, incluyendo su variante LITE.
--
-- Este script:
-- - NO crea módulos
-- - NO crea acciones
-- - NO asigna permisos
--
-- Solo define los perfiles (roles) a nivel sistema.
--
-- CONCEPTO CLAVE
-- --------------
-- El campo roles.codigo es la clave HUMANA y ESTABLE.
-- Todos los scripts posteriores se apoyan en este valor,
-- nunca en UUIDs hardcodeados.
--
-- PATRÓN RECOMENDADO
-- ------------------
-- Por cada módulo funcional:
-- - un rol FULL (acceso completo)
-- - un rol LITE (acceso reducido, luego recortado)
--
-- IDempotencia:
-- -------------
-- - Si el rol ya existe (mismo codigo), NO se duplica.
-- - Se puede ejecutar múltiples veces sin efectos adversos.
-- ============================================================
WITH
-- ============================================================
-- PARAMETROS DEL ROL (EDITAR SOLO ACA)
-- ============================================================
params AS (
SELECT
-- Rol FULL
'TRAMOS_GESTION'::text AS rol_full_codigo,
'Tramos Gestión'::text AS rol_full_nombre,
'Acceso completo a la gestión de tramos'::text
AS rol_full_descripcion,
-- Rol LITE
'TRAMOS_GESTION_LITE'::text AS rol_lite_codigo,
'Tramos Gestión (LITE)'::text AS rol_lite_nombre,
'Acceso de solo consulta a la gestión de tramos'::text
AS rol_lite_descripcion
),
-- ============================================================
-- CREAR / ASEGURAR ROL FULL
-- ============================================================
insert_rol_full AS (
INSERT INTO public.roles (id, codigo, nombre, descripcion)
SELECT
gen_random_uuid(),
p.rol_full_codigo,
p.rol_full_nombre,
p.rol_full_descripcion
FROM params p
ON CONFLICT (codigo) DO NOTHING
RETURNING id, codigo
),
-- ============================================================
-- CREAR / ASEGURAR ROL LITE
-- ============================================================
insert_rol_lite AS (
INSERT INTO public.roles (id, codigo, nombre, descripcion)
SELECT
gen_random_uuid(),
p.rol_lite_codigo,
p.rol_lite_nombre,
p.rol_lite_descripcion
FROM params p
ON CONFLICT (codigo) DO NOTHING
RETURNING id, codigo
)
-- ============================================================
-- SALIDA DE CONTROL / AUDITORIA
-- ============================================================
SELECT
r.codigo,
r.nombre,
r.descripcion
FROM public.roles r
JOIN params p
ON r.codigo IN (p.rol_full_codigo, p.rol_lite_codigo)
ORDER BY r.codigo;