Aplicar migraciones de asignatura #63

Closed
opened 2026-03-13 22:11:30 +00:00 by alexrg · 1 comment
Owner

1️⃣ Crear la columna

alter table public.asignaturas
add column if not exists prerrequisito_asignatura_id uuid null;

2️⃣ CHECK para evitar autoreferencia

alter table public.asignaturas
add constraint asignaturas_prerrequisito_self_check
check (
  prerrequisito_asignatura_id is null
  or prerrequisito_asignatura_id <> id
);

3️⃣ Foreign Key

alter table public.asignaturas
add constraint asignaturas_prerrequisito_asignatura_id_fkey
foreign key (prerrequisito_asignatura_id)
references public.asignaturas (id)
on delete set null;

4️⃣ Índice para consultas

create index if not exists asignaturas_prerrequisito_idx
on public.asignaturas (prerrequisito_asignatura_id);

5️⃣ Función de validación

Valida:

  • mismo plan_estudio_id
  • numero_ciclo menor
create or replace function public.validar_prerrequisito_asignatura()
returns trigger
language plpgsql
as $$
declare
  v_plan uuid;
  v_ciclo integer;
begin

  if new.prerrequisito_asignatura_id is null then
    return new;
  end if;

  select
    plan_estudio_id,
    numero_ciclo
  into
    v_plan,
    v_ciclo
  from public.asignaturas
  where id = new.prerrequisito_asignatura_id;

  if not found then
    raise exception
      'La asignatura prerrequisito no existe';
  end if;

  if v_plan <> new.plan_estudio_id then
    raise exception
      'El prerrequisito debe pertenecer al mismo plan de estudio';
  end if;

  if new.numero_ciclo is null then
    raise exception
      'La asignatura debe tener numero_ciclo definido';
  end if;

  if v_ciclo is null then
    raise exception
      'El prerrequisito debe tener numero_ciclo definido';
  end if;

  if v_ciclo >= new.numero_ciclo then
    raise exception
      'El prerrequisito debe pertenecer a un ciclo menor';
  end if;

  return new;

end;
$$;

6️⃣ Trigger

Se ejecuta cuando se inserta o cambia:

  • prerrequisito_asignatura_id
  • numero_ciclo
  • plan_estudio_id
drop trigger if exists trg_validar_prerrequisito_asignatura
on public.asignaturas;

create trigger trg_validar_prerrequisito_asignatura
before insert or update of
  prerrequisito_asignatura_id,
  numero_ciclo,
  plan_estudio_id
on public.asignaturas
for each row
execute function public.validar_prerrequisito_asignatura();
# 1️⃣ Crear la columna ```sql alter table public.asignaturas add column if not exists prerrequisito_asignatura_id uuid null; ``` --- # 2️⃣ CHECK para evitar autoreferencia ```sql alter table public.asignaturas add constraint asignaturas_prerrequisito_self_check check ( prerrequisito_asignatura_id is null or prerrequisito_asignatura_id <> id ); ``` --- # 3️⃣ Foreign Key ```sql alter table public.asignaturas add constraint asignaturas_prerrequisito_asignatura_id_fkey foreign key (prerrequisito_asignatura_id) references public.asignaturas (id) on delete set null; ``` --- # 4️⃣ Índice para consultas ```sql create index if not exists asignaturas_prerrequisito_idx on public.asignaturas (prerrequisito_asignatura_id); ``` --- # 5️⃣ Función de validación Valida: * mismo `plan_estudio_id` * `numero_ciclo` menor ```sql create or replace function public.validar_prerrequisito_asignatura() returns trigger language plpgsql as $$ declare v_plan uuid; v_ciclo integer; begin if new.prerrequisito_asignatura_id is null then return new; end if; select plan_estudio_id, numero_ciclo into v_plan, v_ciclo from public.asignaturas where id = new.prerrequisito_asignatura_id; if not found then raise exception 'La asignatura prerrequisito no existe'; end if; if v_plan <> new.plan_estudio_id then raise exception 'El prerrequisito debe pertenecer al mismo plan de estudio'; end if; if new.numero_ciclo is null then raise exception 'La asignatura debe tener numero_ciclo definido'; end if; if v_ciclo is null then raise exception 'El prerrequisito debe tener numero_ciclo definido'; end if; if v_ciclo >= new.numero_ciclo then raise exception 'El prerrequisito debe pertenecer a un ciclo menor'; end if; return new; end; $$; ``` --- # 6️⃣ Trigger Se ejecuta cuando se inserta o cambia: * `prerrequisito_asignatura_id` * `numero_ciclo` * `plan_estudio_id` ```sql drop trigger if exists trg_validar_prerrequisito_asignatura on public.asignaturas; create trigger trg_validar_prerrequisito_asignatura before insert or update of prerrequisito_asignatura_id, numero_ciclo, plan_estudio_id on public.asignaturas for each row execute function public.validar_prerrequisito_asignatura(); ```
roberto.silva was assigned by alexrg 2026-03-13 22:11:35 +00:00
alexrg added the Kind/Feature label 2026-03-13 22:11:41 +00:00
Author
Owner

Para que no pase el sistema de evaluación del 100%

alter table public.asignaturas
add constraint asignaturas_criterios_porcentaje_max_100
check (
  (
    select coalesce(sum((elem->>'porcentaje')::numeric),0)
    from jsonb_array_elements(criterios_de_evaluacion) elem
  ) <= 100
);
# Para que no pase el sistema de evaluación del 100% ```sql alter table public.asignaturas add constraint asignaturas_criterios_porcentaje_max_100 check ( ( select coalesce(sum((elem->>'porcentaje')::numeric),0) from jsonb_array_elements(criterios_de_evaluacion) elem ) <= 100 ); ```
Sign in to join this conversation.