Appearance
03_roles_modulos.sql
Objetivo
Asignar un MÓDULO existente a uno o más ROLES existentes.
Este script:
- Une roles ↔ módulos (
roles_modulos). - Define qué roles VEN el módulo en el menú.
- Prepara el terreno para que el trigger de acciones funcione.
Concepto clave
Si un rol NO está en roles_modulos para un módulo:
- El módulo NO aparece en el menú.
- Las acciones del módulo NO se asignan por trigger.
Este paso SIEMPRE debe ejecutarse antes de crear acciones.
Idempotencia
ON CONFLICT DO NOTHINGevita duplicados.- Puede ejecutarse múltiples veces sin efectos adversos.
Script completo
sql
-- ============================================================
-- 03_roles_modulos.sql
-- ============================================================
-- OBJETIVO
-- --------
-- Asignar un MÓDULO existente a uno o más ROLES existentes.
--
-- Este script:
-- - Une roles ↔ módulos (roles_modulos)
-- - Define qué roles VEN el módulo en el menú
-- - Prepara el terreno para que el trigger de acciones funcione
--
-- IDempotencia:
-- -------------
-- - ON CONFLICT DO NOTHING evita duplicados
-- ============================================================
WITH
-- ============================================================
-- PARAMETROS (EDITAR SOLO ACA)
-- ============================================================
params AS (
SELECT
'TRAMOS_GESTION'::text AS rol_full_codigo,
'TRAMOS_GESTION_LITE'::text AS rol_lite_codigo,
'gestion'::text AS p_app_id,
'Tramos PP'::text AS p_modulo_nombre
),
-- ============================================================
-- RESOLVER IDS DE ROLES
-- ============================================================
roles_resueltos AS (
SELECT r.id, r.codigo
FROM public.roles r
JOIN params p
ON r.codigo IN (p.rol_full_codigo, p.rol_lite_codigo)
),
-- ============================================================
-- RESOLVER ID DEL MODULO
-- ============================================================
modulo_resuelto AS (
SELECT m.id
FROM public.apps_modulos m
JOIN params p
ON m.app_id = p.p_app_id
AND m.nombre = p.p_modulo_nombre
),
-- ============================================================
-- ASIGNAR MODULO A ROLES
-- ============================================================
insert_roles_modulos AS (
INSERT INTO public.roles_modulos (rol_id, modulo_id)
SELECT
r.id,
m.id
FROM roles_resueltos r
CROSS JOIN modulo_resuelto m
ON CONFLICT DO NOTHING
RETURNING rol_id, modulo_id
)
-- ============================================================
-- SALIDA DE CONTROL / AUDITORIA
-- ============================================================
SELECT
r.codigo AS rol_codigo,
m.app_id AS app_id,
m.nombre AS modulo
FROM public.roles_modulos rm
JOIN public.roles r ON r.id = rm.rol_id
JOIN public.apps_modulos m ON m.id = rm.modulo_id
JOIN params p
ON m.app_id = p.p_app_id
AND m.nombre = p.p_modulo_nombre
AND r.codigo IN (p.rol_full_codigo, p.rol_lite_codigo)
ORDER BY r.codigo;