| 38 | | Trigger Purpose |
| 39 | | `trg_academic_program_defaults` Manages updated_at timestamps; prevents backward updates |
| 40 | | `trg_prevent_prereq_cycle` Prevents circular prerequisite dependencies using a recursive CTE |
| 41 | | `trg_prevent_equiv_duplicate` Prevents duplicate symmetric course equivalences |
| 42 | | `trg_validate_submission_grade` Ensures submission grade does not exceed exercise max_grade and is not negative |
| 43 | | `trg_validate_survey_response_option` Ensures survey responses reference valid options |
| 44 | | `trg_validate_survey_response_timing` Ensures responses are submitted before the survey closes |
| 45 | | `trg_validate_exam_attempt_timing` Validates exam attempt is not before start and not more than 5 min after end |
| 46 | | `trg_validate_course_edition_year` Prevents future editions and ensures edition starts after course creation |
| | 38 | || Trigger || Purpose || |
| | 39 | || `trg_academic_program_defaults` || Manages `updated_at` timestamps; prevents backward updates |
| | 40 | || `trg_prevent_prereq_cycle` || Prevents circular prerequisite dependencies using a recursive CTE |
| | 41 | || `trg_prevent_equiv_duplicate` || Prevents duplicate symmetric course equivalences |
| | 42 | || `trg_validate_submission_grade` || Ensures submission grade does not exceed exercise `max_grade` and is not negative |
| | 43 | || `trg_validate_survey_response_option` || Ensures survey responses reference valid options |
| | 44 | || `trg_validate_survey_response_timing` || Ensures responses are submitted before the survey closes |
| | 45 | || `trg_validate_exam_attempt_timing` || Validates exam attempt is not before start and not more than 5 min after end |
| | 46 | || `trg_validate_course_edition_year` || Prevents future editions and ensures edition starts after course creation |