createorreplacefunctionpublic.validar_prerrequisito_asignatura()returnstriggerlanguageplpgsqlas$$declarev_planuuid;v_ciclointeger;beginifnew.prerrequisito_asignatura_idisnullthenreturnnew;endif;selectplan_estudio_id,numero_ciclointov_plan,v_ciclofrompublic.asignaturaswhereid=new.prerrequisito_asignatura_id;ifnotfoundthenraiseexception'La asignatura prerrequisito no existe';endif;ifv_plan<>new.plan_estudio_idthenraiseexception'El prerrequisito debe pertenecer al mismo plan de estudio';endif;ifnew.numero_cicloisnullthenraiseexception'La asignatura debe tener numero_ciclo definido';endif;ifv_cicloisnullthenraiseexception'El prerrequisito debe tener numero_ciclo definido';endif;ifv_ciclo>=new.numero_ciclothenraiseexception'El prerrequisito debe pertenecer a un ciclo menor';endif;returnnew;end;$$;
# 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 alexrg2026-03-13 22:11:35 +00:00
# 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
);
```
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
1️⃣ Crear la columna
2️⃣ CHECK para evitar autoreferencia
3️⃣ Foreign Key
4️⃣ Índice para consultas
5️⃣ Función de validación
Valida:
plan_estudio_idnumero_ciclomenor6️⃣ Trigger
Se ejecuta cuando se inserta o cambia:
prerrequisito_asignatura_idnumero_cicloplan_estudio_idPara que no pase el sistema de evaluación del 100%