Files
Academic-Affairs-System/src/Jiaowu.Api/Infrastructure/Persistence/DevelopmentSqliteMigrator.cs
T
biss 6538b6080a 自动排课:保留手工安排,按教师、行政班、周次、节次、容量和场地约束补排。
课程约束:可限定校区、教学楼、指定教室、允许上课日、最早/最晚节次。
无教室课程:教室可为空,但仍校验教师和班级冲突。
作息维护:按学期维护节次、上下课时间和启用状态。
发布保护:发布前重新检查全部约束,并阻止学时未排满的课表发布。
工作台升级:增加“排课规则与作息”“自动排课”入口,自动生成后仍支持手工微调。
同时兼容 SQLite 和 MySQL,已生成正式迁移。
2026-07-24 19:19:18 +08:00

957 lines
43 KiB
C#

using Microsoft.EntityFrameworkCore;
namespace Jiaowu.Api.Infrastructure.Persistence;
public sealed class DevelopmentSqliteMigrator(
AppDbContext db,
ILogger<DevelopmentSqliteMigrator> logger)
{
private const string PeopleAndCoursesMigration = "20260724_01_people_courses";
private const string CurriculumPlansMigration = "20260724_02_curriculum_plans";
private const string TeachingTasksMigration = "20260724_03_teaching_tasks";
private const string SchedulesMigration = "20260724_04_schedules";
private const string ClassCounselorMigration = "20260724_05_class_counselor";
private const string CourseSelectionMigration = "20260724_06_course_selection";
private const string GradesMigration = "20260724_07_grades";
private const string ExamsMigration = "20260724_08_exams";
private const string StudentStatusChangesMigration = "20260724_09_student_status_changes";
private const string GraduationAuditsMigration = "20260724_10_graduation_audits";
private const string DegreeAwardsMigration = "20260724_11_degree_awards";
private const string GraduationClearanceMigration = "20260724_12_graduation_clearance";
private const string CourseCategoriesMigration = "20260724_13_course_categories";
private const string SchedulingOptimizationMigration =
"20260724_14_scheduling_optimization";
public async Task MigrateAsync(CancellationToken cancellationToken = default)
{
if (!db.Database.IsSqlite())
{
return;
}
await db.Database.ExecuteSqlRawAsync(
"""
CREATE TABLE IF NOT EXISTS "__DevelopmentSchemaHistory" (
"MigrationId" TEXT NOT NULL CONSTRAINT "PK___DevelopmentSchemaHistory" PRIMARY KEY,
"AppliedAt" TEXT NOT NULL
);
""",
cancellationToken);
await ApplyMigrationAsync(
PeopleAndCoursesMigration,
PeopleAndCoursesStatements,
cancellationToken);
await ApplyMigrationAsync(
CurriculumPlansMigration,
CurriculumPlansStatements,
cancellationToken);
await ApplyMigrationAsync(
TeachingTasksMigration,
TeachingTasksStatements,
cancellationToken);
await ApplyMigrationAsync(
SchedulesMigration,
SchedulesStatements,
cancellationToken);
var counselorColumnExists = await db.Database
.SqlQueryRaw<int>(
"""
SELECT COUNT(*) AS "Value"
FROM pragma_table_info('AdministrativeClasses')
WHERE name = 'CounselorUserId'
""")
.AnyAsync(value => value > 0, cancellationToken);
await ApplyMigrationAsync(
ClassCounselorMigration,
counselorColumnExists
? ClassCounselorStatements.Skip(1)
: ClassCounselorStatements,
cancellationToken);
await ApplyMigrationAsync(
CourseSelectionMigration,
CourseSelectionStatements,
cancellationToken);
await ApplyMigrationAsync(
GradesMigration,
GradesStatements,
cancellationToken);
await ApplyMigrationAsync(ExamsMigration, ExamsStatements, cancellationToken);
await ApplyMigrationAsync(
StudentStatusChangesMigration,
StudentStatusChangesStatements,
cancellationToken);
await ApplyMigrationAsync(
GraduationAuditsMigration,
GraduationAuditsStatements,
cancellationToken);
await ApplyMigrationAsync(
DegreeAwardsMigration,
DegreeAwardsStatements,
cancellationToken);
await ApplyMigrationAsync(
GraduationClearanceMigration,
GraduationClearanceStatements,
cancellationToken);
var courseCategoryColumnExists = await db.Database
.SqlQueryRaw<int>(
"""
SELECT COUNT(*) AS "Value"
FROM pragma_table_info('Courses')
WHERE name = 'CourseCategoryId'
""")
.AnyAsync(value => value > 0, cancellationToken);
await ApplyMigrationAsync(
CourseCategoriesMigration,
courseCategoryColumnExists
? CourseCategoriesStatements.Where(
statement => !statement.StartsWith(
"ALTER TABLE", StringComparison.OrdinalIgnoreCase))
: CourseCategoriesStatements,
cancellationToken);
var schedulingOptimizationExists = await db.Database
.SqlQueryRaw<int>(
"""
SELECT COUNT(*) AS "Value"
FROM sqlite_master
WHERE type = 'table' AND name = 'ScheduleTimeSlots'
""")
.AnyAsync(value => value > 0, cancellationToken);
await ApplyMigrationAsync(
SchedulingOptimizationMigration,
schedulingOptimizationExists ? [] : SchedulingOptimizationStatements,
cancellationToken);
}
private async Task ApplyMigrationAsync(
string migrationId,
IEnumerable<string> statements,
CancellationToken cancellationToken)
{
var applied = await db.Database
.SqlQuery<string>(
$"""
SELECT "MigrationId" AS "Value"
FROM "__DevelopmentSchemaHistory"
WHERE "MigrationId" = {migrationId}
""")
.AnyAsync(cancellationToken);
if (applied)
{
return;
}
await using var transaction = await db.Database.BeginTransactionAsync(cancellationToken);
foreach (var statement in statements)
{
await db.Database.ExecuteSqlRawAsync(statement, cancellationToken);
}
await db.Database.ExecuteSqlInterpolatedAsync(
$"""
INSERT INTO "__DevelopmentSchemaHistory" ("MigrationId", "AppliedAt")
VALUES ({migrationId}, {DateTime.UtcNow});
""",
cancellationToken);
await transaction.CommitAsync(cancellationToken);
logger.LogInformation(
"Applied SQLite development schema migration {MigrationId}.",
migrationId);
}
private static readonly string[] PeopleAndCoursesStatements =
[
"""
CREATE TABLE IF NOT EXISTS "Teachers" (
"Id" TEXT NOT NULL CONSTRAINT "PK_Teachers" PRIMARY KEY,
"TeacherNumber" TEXT NOT NULL,
"Name" TEXT NOT NULL,
"Gender" INTEGER NOT NULL,
"CollegeId" TEXT NOT NULL,
"Title" TEXT NULL,
"Status" INTEGER NOT NULL,
"HireDate" TEXT NULL,
"IsExternal" INTEGER NOT NULL,
"Phone" TEXT NULL,
"Email" TEXT NULL,
"Notes" TEXT NULL,
"UserId" TEXT NULL,
"CreatedAt" TEXT NOT NULL,
"UpdatedAt" TEXT NOT NULL,
CONSTRAINT "FK_Teachers_Colleges_CollegeId"
FOREIGN KEY ("CollegeId") REFERENCES "Colleges" ("Id") ON DELETE RESTRICT,
CONSTRAINT "FK_Teachers_AspNetUsers_UserId"
FOREIGN KEY ("UserId") REFERENCES "AspNetUsers" ("Id") ON DELETE SET NULL
);
""",
"""
CREATE UNIQUE INDEX IF NOT EXISTS "IX_Teachers_TeacherNumber"
ON "Teachers" ("TeacherNumber");
""",
"""
CREATE INDEX IF NOT EXISTS "IX_Teachers_CollegeId_Status"
ON "Teachers" ("CollegeId", "Status");
""",
"""
CREATE INDEX IF NOT EXISTS "IX_Teachers_UserId"
ON "Teachers" ("UserId");
""",
"""
CREATE TABLE IF NOT EXISTS "Students" (
"Id" TEXT NOT NULL CONSTRAINT "PK_Students" PRIMARY KEY,
"StudentNumber" TEXT NOT NULL,
"Name" TEXT NOT NULL,
"Gender" INTEGER NOT NULL,
"AdministrativeClassId" TEXT NOT NULL,
"EnrollmentYear" INTEGER NOT NULL,
"EnrollmentDate" TEXT NOT NULL,
"Status" INTEGER NOT NULL,
"DateOfBirth" TEXT NULL,
"Phone" TEXT NULL,
"Email" TEXT NULL,
"Notes" TEXT NULL,
"UserId" TEXT NULL,
"CreatedAt" TEXT NOT NULL,
"UpdatedAt" TEXT NOT NULL,
CONSTRAINT "FK_Students_AdministrativeClasses_AdministrativeClassId"
FOREIGN KEY ("AdministrativeClassId") REFERENCES "AdministrativeClasses" ("Id")
ON DELETE RESTRICT,
CONSTRAINT "FK_Students_AspNetUsers_UserId"
FOREIGN KEY ("UserId") REFERENCES "AspNetUsers" ("Id") ON DELETE SET NULL
);
""",
"""
CREATE UNIQUE INDEX IF NOT EXISTS "IX_Students_StudentNumber"
ON "Students" ("StudentNumber");
""",
"""
CREATE INDEX IF NOT EXISTS "IX_Students_AdministrativeClassId_Status"
ON "Students" ("AdministrativeClassId", "Status");
""",
"""
CREATE INDEX IF NOT EXISTS "IX_Students_EnrollmentYear"
ON "Students" ("EnrollmentYear");
""",
"""
CREATE INDEX IF NOT EXISTS "IX_Students_UserId"
ON "Students" ("UserId");
""",
"""
CREATE TABLE IF NOT EXISTS "Courses" (
"Id" TEXT NOT NULL CONSTRAINT "PK_Courses" PRIMARY KEY,
"CollegeId" TEXT NOT NULL,
"EnglishName" TEXT NULL,
"Credits" TEXT NOT NULL,
"TotalHours" INTEGER NOT NULL,
"LectureHours" INTEGER NOT NULL,
"PracticeHours" INTEGER NOT NULL,
"Nature" INTEGER NOT NULL,
"AssessmentMethod" INTEGER NOT NULL,
"Description" TEXT NULL,
"CreatedAt" TEXT NOT NULL,
"UpdatedAt" TEXT NOT NULL,
"Code" TEXT NOT NULL,
"Name" TEXT NOT NULL,
"SortOrder" INTEGER NOT NULL,
"IsEnabled" INTEGER NOT NULL,
CONSTRAINT "FK_Courses_Colleges_CollegeId"
FOREIGN KEY ("CollegeId") REFERENCES "Colleges" ("Id") ON DELETE RESTRICT
);
""",
"""
CREATE UNIQUE INDEX IF NOT EXISTS "IX_Courses_Code" ON "Courses" ("Code");
""",
"""
CREATE INDEX IF NOT EXISTS "IX_Courses_IsEnabled_SortOrder"
ON "Courses" ("IsEnabled", "SortOrder");
""",
"""
CREATE INDEX IF NOT EXISTS "IX_Courses_CollegeId_Nature"
ON "Courses" ("CollegeId", "Nature");
"""
];
private static readonly string[] CurriculumPlansStatements =
[
"""
CREATE TABLE IF NOT EXISTS "CurriculumPlans" (
"Id" TEXT NOT NULL CONSTRAINT "PK_CurriculumPlans" PRIMARY KEY,
"MajorId" TEXT NOT NULL,
"Name" TEXT NOT NULL,
"Version" TEXT NOT NULL,
"EffectiveGrade" INTEGER NOT NULL,
"TotalCredits" TEXT NOT NULL,
"Status" INTEGER NOT NULL,
"Description" TEXT NULL,
"PublishedAt" TEXT NULL,
"CreatedAt" TEXT NOT NULL,
"UpdatedAt" TEXT NOT NULL,
CONSTRAINT "FK_CurriculumPlans_Majors_MajorId"
FOREIGN KEY ("MajorId") REFERENCES "Majors" ("Id") ON DELETE RESTRICT
);
""",
"""
CREATE UNIQUE INDEX IF NOT EXISTS "IX_CurriculumPlans_MajorId_EffectiveGrade_Version"
ON "CurriculumPlans" ("MajorId", "EffectiveGrade", "Version");
""",
"""
CREATE INDEX IF NOT EXISTS "IX_CurriculumPlans_Status_EffectiveGrade"
ON "CurriculumPlans" ("Status", "EffectiveGrade");
""",
"""
CREATE TABLE IF NOT EXISTS "CurriculumModules" (
"Id" TEXT NOT NULL CONSTRAINT "PK_CurriculumModules" PRIMARY KEY,
"CurriculumPlanId" TEXT NOT NULL,
"Code" TEXT NOT NULL,
"Name" TEXT NOT NULL,
"RequiredCredits" TEXT NOT NULL,
"SortOrder" INTEGER NOT NULL,
"CreatedAt" TEXT NOT NULL,
"UpdatedAt" TEXT NOT NULL,
CONSTRAINT "FK_CurriculumModules_CurriculumPlans_CurriculumPlanId"
FOREIGN KEY ("CurriculumPlanId") REFERENCES "CurriculumPlans" ("Id")
ON DELETE CASCADE
);
""",
"""
CREATE UNIQUE INDEX IF NOT EXISTS "IX_CurriculumModules_CurriculumPlanId_Code"
ON "CurriculumModules" ("CurriculumPlanId", "Code");
""",
"""
CREATE TABLE IF NOT EXISTS "CurriculumCourses" (
"Id" TEXT NOT NULL CONSTRAINT "PK_CurriculumCourses" PRIMARY KEY,
"CurriculumModuleId" TEXT NOT NULL,
"CourseId" TEXT NOT NULL,
"RecommendedSemester" INTEGER NOT NULL,
"Type" INTEGER NOT NULL,
"Notes" TEXT NULL,
"CreatedAt" TEXT NOT NULL,
"UpdatedAt" TEXT NOT NULL,
CONSTRAINT "FK_CurriculumCourses_CurriculumModules_CurriculumModuleId"
FOREIGN KEY ("CurriculumModuleId") REFERENCES "CurriculumModules" ("Id")
ON DELETE CASCADE,
CONSTRAINT "FK_CurriculumCourses_Courses_CourseId"
FOREIGN KEY ("CourseId") REFERENCES "Courses" ("Id") ON DELETE RESTRICT
);
""",
"""
CREATE UNIQUE INDEX IF NOT EXISTS "IX_CurriculumCourses_CurriculumModuleId_CourseId"
ON "CurriculumCourses" ("CurriculumModuleId", "CourseId");
""",
"""
CREATE INDEX IF NOT EXISTS "IX_CurriculumCourses_CourseId"
ON "CurriculumCourses" ("CourseId");
"""
];
private static readonly string[] TeachingTasksStatements =
[
"""
CREATE TABLE IF NOT EXISTS "TeachingTasks" (
"Id" TEXT NOT NULL CONSTRAINT "PK_TeachingTasks" PRIMARY KEY,
"TaskNumber" TEXT NOT NULL,
"Name" TEXT NOT NULL,
"AcademicTermId" TEXT NOT NULL,
"CourseId" TEXT NOT NULL,
"Capacity" INTEGER NOT NULL,
"StartWeek" INTEGER NOT NULL,
"EndWeek" INTEGER NOT NULL,
"WeeklyHours" INTEGER NOT NULL,
"Status" INTEGER NOT NULL,
"Notes" TEXT NULL,
"PublishedAt" TEXT NULL,
"CreatedAt" TEXT NOT NULL,
"UpdatedAt" TEXT NOT NULL,
CONSTRAINT "FK_TeachingTasks_AcademicTerms_AcademicTermId"
FOREIGN KEY ("AcademicTermId") REFERENCES "AcademicTerms" ("Id") ON DELETE RESTRICT,
CONSTRAINT "FK_TeachingTasks_Courses_CourseId"
FOREIGN KEY ("CourseId") REFERENCES "Courses" ("Id") ON DELETE RESTRICT
);
""",
"""
CREATE UNIQUE INDEX IF NOT EXISTS "IX_TeachingTasks_TaskNumber"
ON "TeachingTasks" ("TaskNumber");
""",
"""
CREATE INDEX IF NOT EXISTS "IX_TeachingTasks_AcademicTermId_Status"
ON "TeachingTasks" ("AcademicTermId", "Status");
""",
"""
CREATE INDEX IF NOT EXISTS "IX_TeachingTasks_CourseId"
ON "TeachingTasks" ("CourseId");
""",
"""
CREATE TABLE IF NOT EXISTS "TeachingTaskTeachers" (
"TeachingTaskId" TEXT NOT NULL,
"TeacherId" TEXT NOT NULL,
"IsPrimary" INTEGER NOT NULL,
CONSTRAINT "PK_TeachingTaskTeachers"
PRIMARY KEY ("TeachingTaskId", "TeacherId"),
CONSTRAINT "FK_TeachingTaskTeachers_TeachingTasks_TeachingTaskId"
FOREIGN KEY ("TeachingTaskId") REFERENCES "TeachingTasks" ("Id") ON DELETE CASCADE,
CONSTRAINT "FK_TeachingTaskTeachers_Teachers_TeacherId"
FOREIGN KEY ("TeacherId") REFERENCES "Teachers" ("Id") ON DELETE RESTRICT
);
""",
"""
CREATE INDEX IF NOT EXISTS "IX_TeachingTaskTeachers_TeacherId"
ON "TeachingTaskTeachers" ("TeacherId");
""",
"""
CREATE TABLE IF NOT EXISTS "TeachingTaskClasses" (
"TeachingTaskId" TEXT NOT NULL,
"AdministrativeClassId" TEXT NOT NULL,
CONSTRAINT "PK_TeachingTaskClasses"
PRIMARY KEY ("TeachingTaskId", "AdministrativeClassId"),
CONSTRAINT "FK_TeachingTaskClasses_TeachingTasks_TeachingTaskId"
FOREIGN KEY ("TeachingTaskId") REFERENCES "TeachingTasks" ("Id") ON DELETE CASCADE,
CONSTRAINT "FK_TeachingTaskClasses_AdministrativeClasses_AdministrativeClassId"
FOREIGN KEY ("AdministrativeClassId") REFERENCES "AdministrativeClasses" ("Id")
ON DELETE RESTRICT
);
""",
"""
CREATE INDEX IF NOT EXISTS "IX_TeachingTaskClasses_AdministrativeClassId"
ON "TeachingTaskClasses" ("AdministrativeClassId");
"""
];
private static readonly string[] SchedulesStatements =
[
"""
CREATE TABLE IF NOT EXISTS "SchedulePlans" (
"Id" TEXT NOT NULL CONSTRAINT "PK_SchedulePlans" PRIMARY KEY,
"AcademicTermId" TEXT NOT NULL,
"Name" TEXT NOT NULL,
"Version" TEXT NOT NULL,
"Status" INTEGER NOT NULL,
"Notes" TEXT NULL,
"PublishedAt" TEXT NULL,
"CreatedAt" TEXT NOT NULL,
"UpdatedAt" TEXT NOT NULL,
CONSTRAINT "FK_SchedulePlans_AcademicTerms_AcademicTermId"
FOREIGN KEY ("AcademicTermId") REFERENCES "AcademicTerms" ("Id") ON DELETE RESTRICT
);
""",
"""
CREATE UNIQUE INDEX IF NOT EXISTS "IX_SchedulePlans_AcademicTermId_Version"
ON "SchedulePlans" ("AcademicTermId", "Version");
""",
"""
CREATE INDEX IF NOT EXISTS "IX_SchedulePlans_AcademicTermId_Status"
ON "SchedulePlans" ("AcademicTermId", "Status");
""",
"""
CREATE TABLE IF NOT EXISTS "ScheduleEntries" (
"Id" TEXT NOT NULL CONSTRAINT "PK_ScheduleEntries" PRIMARY KEY,
"SchedulePlanId" TEXT NOT NULL,
"TeachingTaskId" TEXT NOT NULL,
"ClassroomId" TEXT NOT NULL,
"DayOfWeek" INTEGER NOT NULL,
"StartPeriod" INTEGER NOT NULL,
"PeriodCount" INTEGER NOT NULL,
"StartWeek" INTEGER NOT NULL,
"EndWeek" INTEGER NOT NULL,
"WeekPattern" INTEGER NOT NULL,
"Notes" TEXT NULL,
"CreatedAt" TEXT NOT NULL,
"UpdatedAt" TEXT NOT NULL,
CONSTRAINT "FK_ScheduleEntries_SchedulePlans_SchedulePlanId"
FOREIGN KEY ("SchedulePlanId") REFERENCES "SchedulePlans" ("Id") ON DELETE CASCADE,
CONSTRAINT "FK_ScheduleEntries_TeachingTasks_TeachingTaskId"
FOREIGN KEY ("TeachingTaskId") REFERENCES "TeachingTasks" ("Id") ON DELETE RESTRICT,
CONSTRAINT "FK_ScheduleEntries_Classrooms_ClassroomId"
FOREIGN KEY ("ClassroomId") REFERENCES "Classrooms" ("Id") ON DELETE RESTRICT
);
""",
"""
CREATE INDEX IF NOT EXISTS "IX_ScheduleEntries_SchedulePlanId_DayOfWeek_StartPeriod"
ON "ScheduleEntries" ("SchedulePlanId", "DayOfWeek", "StartPeriod");
""",
"""
CREATE INDEX IF NOT EXISTS "IX_ScheduleEntries_TeachingTaskId"
ON "ScheduleEntries" ("TeachingTaskId");
""",
"""
CREATE INDEX IF NOT EXISTS "IX_ScheduleEntries_ClassroomId"
ON "ScheduleEntries" ("ClassroomId");
"""
];
private static readonly string[] ClassCounselorStatements =
[
"""
ALTER TABLE "AdministrativeClasses"
ADD COLUMN "CounselorUserId" TEXT NULL;
""",
"""
CREATE INDEX IF NOT EXISTS "IX_AdministrativeClasses_CounselorUserId"
ON "AdministrativeClasses" ("CounselorUserId");
"""
];
private static readonly string[] CourseSelectionStatements =
[
"""
CREATE TABLE IF NOT EXISTS "CourseSelectionRounds" (
"Id" TEXT NOT NULL CONSTRAINT "PK_CourseSelectionRounds" PRIMARY KEY,
"AcademicTermId" TEXT NOT NULL,
"Name" TEXT NOT NULL,
"StartsAt" TEXT NOT NULL,
"EndsAt" TEXT NOT NULL,
"WithdrawalEndsAt" TEXT NOT NULL,
"MaxCredits" TEXT NOT NULL,
"Status" INTEGER NOT NULL,
"Notes" TEXT NULL,
"CreatedAt" TEXT NOT NULL,
"UpdatedAt" TEXT NOT NULL,
CONSTRAINT "FK_CourseSelectionRounds_AcademicTerms_AcademicTermId"
FOREIGN KEY ("AcademicTermId") REFERENCES "AcademicTerms" ("Id") ON DELETE RESTRICT
);
""",
"""
CREATE INDEX IF NOT EXISTS "IX_CourseSelectionRounds_AcademicTermId_Status"
ON "CourseSelectionRounds" ("AcademicTermId", "Status");
""",
"""
CREATE TABLE IF NOT EXISTS "CourseSelectionOfferings" (
"Id" TEXT NOT NULL CONSTRAINT "PK_CourseSelectionOfferings" PRIMARY KEY,
"CourseSelectionRoundId" TEXT NOT NULL,
"TeachingTaskId" TEXT NOT NULL,
"Capacity" INTEGER NOT NULL,
"IsOpenToAll" INTEGER NOT NULL,
"Notes" TEXT NULL,
"CreatedAt" TEXT NOT NULL,
"UpdatedAt" TEXT NOT NULL,
CONSTRAINT "FK_CourseSelectionOfferings_CourseSelectionRounds_CourseSelectionRoundId"
FOREIGN KEY ("CourseSelectionRoundId") REFERENCES "CourseSelectionRounds" ("Id")
ON DELETE CASCADE,
CONSTRAINT "FK_CourseSelectionOfferings_TeachingTasks_TeachingTaskId"
FOREIGN KEY ("TeachingTaskId") REFERENCES "TeachingTasks" ("Id") ON DELETE RESTRICT
);
""",
"""
CREATE UNIQUE INDEX IF NOT EXISTS "IX_CourseSelectionOfferings_CourseSelectionRoundId_TeachingTaskId"
ON "CourseSelectionOfferings" ("CourseSelectionRoundId", "TeachingTaskId");
""",
"""
CREATE INDEX IF NOT EXISTS "IX_CourseSelectionOfferings_TeachingTaskId"
ON "CourseSelectionOfferings" ("TeachingTaskId");
""",
"""
CREATE TABLE IF NOT EXISTS "CourseEnrollments" (
"Id" TEXT NOT NULL CONSTRAINT "PK_CourseEnrollments" PRIMARY KEY,
"CourseSelectionOfferingId" TEXT NOT NULL,
"StudentId" TEXT NOT NULL,
"Status" INTEGER NOT NULL,
"EnrolledAt" TEXT NOT NULL,
"WithdrawnAt" TEXT NULL,
"CreatedAt" TEXT NOT NULL,
"UpdatedAt" TEXT NOT NULL,
CONSTRAINT "FK_CourseEnrollments_CourseSelectionOfferings_CourseSelectionOfferingId"
FOREIGN KEY ("CourseSelectionOfferingId") REFERENCES "CourseSelectionOfferings" ("Id")
ON DELETE CASCADE,
CONSTRAINT "FK_CourseEnrollments_Students_StudentId"
FOREIGN KEY ("StudentId") REFERENCES "Students" ("Id") ON DELETE RESTRICT
);
""",
"""
CREATE UNIQUE INDEX IF NOT EXISTS "IX_CourseEnrollments_CourseSelectionOfferingId_StudentId"
ON "CourseEnrollments" ("CourseSelectionOfferingId", "StudentId");
""",
"""
CREATE INDEX IF NOT EXISTS "IX_CourseEnrollments_StudentId_Status"
ON "CourseEnrollments" ("StudentId", "Status");
"""
];
private static readonly string[] GradesStatements =
[
"""
CREATE TABLE IF NOT EXISTS "GradeSheets" (
"Id" TEXT NOT NULL CONSTRAINT "PK_GradeSheets" PRIMARY KEY,
"TeachingTaskId" TEXT NOT NULL,
"RegularWeight" TEXT NOT NULL,
"MidtermWeight" TEXT NOT NULL,
"FinalWeight" TEXT NOT NULL,
"Status" INTEGER NOT NULL,
"ReviewComment" TEXT NULL,
"SubmittedAt" TEXT NULL,
"ReviewedAt" TEXT NULL,
"PublishedAt" TEXT NULL,
"CreatedAt" TEXT NOT NULL,
"UpdatedAt" TEXT NOT NULL,
CONSTRAINT "FK_GradeSheets_TeachingTasks_TeachingTaskId"
FOREIGN KEY ("TeachingTaskId") REFERENCES "TeachingTasks" ("Id") ON DELETE RESTRICT
);
""",
"""
CREATE UNIQUE INDEX IF NOT EXISTS "IX_GradeSheets_TeachingTaskId"
ON "GradeSheets" ("TeachingTaskId");
""",
"""
CREATE INDEX IF NOT EXISTS "IX_GradeSheets_Status"
ON "GradeSheets" ("Status");
""",
"""
CREATE TABLE IF NOT EXISTS "GradeRecords" (
"Id" TEXT NOT NULL CONSTRAINT "PK_GradeRecords" PRIMARY KEY,
"GradeSheetId" TEXT NOT NULL,
"StudentId" TEXT NOT NULL,
"RegularScore" TEXT NULL,
"MidtermScore" TEXT NULL,
"FinalScore" TEXT NULL,
"TotalScore" TEXT NULL,
"GradePoint" TEXT NULL,
"ExamStatus" INTEGER NOT NULL,
"Notes" TEXT NULL,
"CreatedAt" TEXT NOT NULL,
"UpdatedAt" TEXT NOT NULL,
CONSTRAINT "FK_GradeRecords_GradeSheets_GradeSheetId"
FOREIGN KEY ("GradeSheetId") REFERENCES "GradeSheets" ("Id") ON DELETE CASCADE,
CONSTRAINT "FK_GradeRecords_Students_StudentId"
FOREIGN KEY ("StudentId") REFERENCES "Students" ("Id") ON DELETE RESTRICT
);
""",
"""
CREATE UNIQUE INDEX IF NOT EXISTS "IX_GradeRecords_GradeSheetId_StudentId"
ON "GradeRecords" ("GradeSheetId", "StudentId");
""",
"""
CREATE INDEX IF NOT EXISTS "IX_GradeRecords_StudentId_TotalScore"
ON "GradeRecords" ("StudentId", "TotalScore");
"""
];
private static readonly string[] ExamsStatements =
[
"""
CREATE TABLE IF NOT EXISTS "ExamPlans" (
"Id" TEXT NOT NULL CONSTRAINT "PK_ExamPlans" PRIMARY KEY,
"AcademicTermId" TEXT NOT NULL, "Name" TEXT NOT NULL,
"Status" INTEGER NOT NULL, "Notes" TEXT NULL, "PublishedAt" TEXT NULL,
"CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL,
CONSTRAINT "FK_ExamPlans_AcademicTerms_AcademicTermId"
FOREIGN KEY ("AcademicTermId") REFERENCES "AcademicTerms" ("Id") ON DELETE RESTRICT
);
""",
"""CREATE INDEX IF NOT EXISTS "IX_ExamPlans_AcademicTermId_Status" ON "ExamPlans" ("AcademicTermId", "Status");""",
"""
CREATE TABLE IF NOT EXISTS "ExamSessions" (
"Id" TEXT NOT NULL CONSTRAINT "PK_ExamSessions" PRIMARY KEY,
"ExamPlanId" TEXT NOT NULL, "TeachingTaskId" TEXT NOT NULL,
"ClassroomId" TEXT NOT NULL, "StartsAt" TEXT NOT NULL, "EndsAt" TEXT NOT NULL,
"Notes" TEXT NULL, "CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL,
CONSTRAINT "FK_ExamSessions_ExamPlans_ExamPlanId" FOREIGN KEY ("ExamPlanId")
REFERENCES "ExamPlans" ("Id") ON DELETE CASCADE,
CONSTRAINT "FK_ExamSessions_TeachingTasks_TeachingTaskId" FOREIGN KEY ("TeachingTaskId")
REFERENCES "TeachingTasks" ("Id") ON DELETE RESTRICT,
CONSTRAINT "FK_ExamSessions_Classrooms_ClassroomId" FOREIGN KEY ("ClassroomId")
REFERENCES "Classrooms" ("Id") ON DELETE RESTRICT
);
""",
"""CREATE INDEX IF NOT EXISTS "IX_ExamSessions_ExamPlanId_StartsAt" ON "ExamSessions" ("ExamPlanId", "StartsAt");""",
"""CREATE INDEX IF NOT EXISTS "IX_ExamSessions_TeachingTaskId" ON "ExamSessions" ("TeachingTaskId");""",
"""CREATE INDEX IF NOT EXISTS "IX_ExamSessions_ClassroomId" ON "ExamSessions" ("ClassroomId");""",
"""
CREATE TABLE IF NOT EXISTS "ExamSessionInvigilators" (
"ExamSessionId" TEXT NOT NULL, "TeacherId" TEXT NOT NULL,
CONSTRAINT "PK_ExamSessionInvigilators" PRIMARY KEY ("ExamSessionId", "TeacherId"),
CONSTRAINT "FK_ExamSessionInvigilators_ExamSessions_ExamSessionId"
FOREIGN KEY ("ExamSessionId") REFERENCES "ExamSessions" ("Id") ON DELETE CASCADE,
CONSTRAINT "FK_ExamSessionInvigilators_Teachers_TeacherId"
FOREIGN KEY ("TeacherId") REFERENCES "Teachers" ("Id") ON DELETE RESTRICT
);
""",
"""CREATE INDEX IF NOT EXISTS "IX_ExamSessionInvigilators_TeacherId" ON "ExamSessionInvigilators" ("TeacherId");"""
];
private static readonly string[] StudentStatusChangesStatements =
[
"""
CREATE TABLE IF NOT EXISTS "StudentStatusChanges" (
"Id" TEXT NOT NULL CONSTRAINT "PK_StudentStatusChanges" PRIMARY KEY,
"StudentId" TEXT NOT NULL, "Type" INTEGER NOT NULL,
"OriginalStatus" INTEGER NOT NULL, "TargetStatus" INTEGER NOT NULL,
"Reason" TEXT NOT NULL, "State" INTEGER NOT NULL,
"ReviewComment" TEXT NULL, "SubmittedAt" TEXT NOT NULL,
"ReviewedAt" TEXT NULL, "ApprovedAt" TEXT NULL,
"CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL,
CONSTRAINT "FK_StudentStatusChanges_Students_StudentId"
FOREIGN KEY ("StudentId") REFERENCES "Students" ("Id") ON DELETE RESTRICT
);
""",
"""CREATE INDEX IF NOT EXISTS "IX_StudentStatusChanges_StudentId_State" ON "StudentStatusChanges" ("StudentId", "State");"""
];
private static readonly string[] GraduationAuditsStatements =
[
"""
CREATE TABLE IF NOT EXISTS "GraduationAuditBatches" (
"Id" TEXT NOT NULL CONSTRAINT "PK_GraduationAuditBatches" PRIMARY KEY,
"Name" TEXT NOT NULL, "GraduationYear" INTEGER NOT NULL,
"EnrollmentYear" INTEGER NOT NULL, "Status" INTEGER NOT NULL,
"Notes" TEXT NULL, "CalculatedAt" TEXT NULL, "PublishedAt" TEXT NULL,
"CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL
);
""",
"""CREATE INDEX IF NOT EXISTS "IX_GraduationAuditBatches_GraduationYear_EnrollmentYear" ON "GraduationAuditBatches" ("GraduationYear", "EnrollmentYear");""",
"""CREATE INDEX IF NOT EXISTS "IX_GraduationAuditBatches_Status" ON "GraduationAuditBatches" ("Status");""",
"""
CREATE TABLE IF NOT EXISTS "GraduationAuditResults" (
"Id" TEXT NOT NULL CONSTRAINT "PK_GraduationAuditResults" PRIMARY KEY,
"GraduationAuditBatchId" TEXT NOT NULL, "StudentId" TEXT NOT NULL,
"CurriculumPlanId" TEXT NULL, "StudentStatusSnapshot" INTEGER NOT NULL,
"RequiredCredits" TEXT NOT NULL, "EarnedCredits" TEXT NOT NULL,
"RequiredCourseCount" INTEGER NOT NULL,
"PassedRequiredCourseCount" INTEGER NOT NULL,
"FailedCourseCount" INTEGER NOT NULL,
"MissingCourseNames" TEXT NOT NULL,
"CalculatedConclusion" INTEGER NOT NULL, "Conclusion" INTEGER NOT NULL,
"IsOverridden" INTEGER NOT NULL, "ReviewComment" TEXT NULL,
"ReviewedAt" TEXT NULL, "CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL,
CONSTRAINT "FK_GraduationAuditResults_GraduationAuditBatches_GraduationAuditBatchId"
FOREIGN KEY ("GraduationAuditBatchId") REFERENCES "GraduationAuditBatches" ("Id") ON DELETE CASCADE,
CONSTRAINT "FK_GraduationAuditResults_Students_StudentId"
FOREIGN KEY ("StudentId") REFERENCES "Students" ("Id") ON DELETE RESTRICT,
CONSTRAINT "FK_GraduationAuditResults_CurriculumPlans_CurriculumPlanId"
FOREIGN KEY ("CurriculumPlanId") REFERENCES "CurriculumPlans" ("Id") ON DELETE SET NULL
);
""",
"""CREATE UNIQUE INDEX IF NOT EXISTS "IX_GraduationAuditResults_GraduationAuditBatchId_StudentId" ON "GraduationAuditResults" ("GraduationAuditBatchId", "StudentId");""",
"""CREATE INDEX IF NOT EXISTS "IX_GraduationAuditResults_StudentId" ON "GraduationAuditResults" ("StudentId");""",
"""CREATE INDEX IF NOT EXISTS "IX_GraduationAuditResults_CurriculumPlanId" ON "GraduationAuditResults" ("CurriculumPlanId");""",
"""CREATE INDEX IF NOT EXISTS "IX_GraduationAuditResults_Conclusion_IsOverridden" ON "GraduationAuditResults" ("Conclusion", "IsOverridden");"""
];
private static readonly string[] DegreeAwardsStatements =
[
"""
CREATE TABLE IF NOT EXISTS "DegreeAwardBatches" (
"Id" TEXT NOT NULL CONSTRAINT "PK_DegreeAwardBatches" PRIMARY KEY,
"Name" TEXT NOT NULL, "GraduationYear" INTEGER NOT NULL,
"DegreeName" TEXT NOT NULL, "MinimumGradePoint" TEXT NOT NULL,
"Status" INTEGER NOT NULL, "Notes" TEXT NULL,
"CalculatedAt" TEXT NULL, "PublishedAt" TEXT NULL,
"CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL
);
""",
"""CREATE INDEX IF NOT EXISTS "IX_DegreeAwardBatches_GraduationYear_Status" ON "DegreeAwardBatches" ("GraduationYear", "Status");""",
"""
CREATE TABLE IF NOT EXISTS "DegreeAwardResults" (
"Id" TEXT NOT NULL CONSTRAINT "PK_DegreeAwardResults" PRIMARY KEY,
"DegreeAwardBatchId" TEXT NOT NULL, "StudentId" TEXT NOT NULL,
"GraduationAuditResultId" TEXT NOT NULL, "AverageGradePoint" TEXT NOT NULL,
"CalculatedConclusion" INTEGER NOT NULL, "Conclusion" INTEGER NOT NULL,
"ExceptionReason" TEXT NOT NULL, "IsOverridden" INTEGER NOT NULL,
"ReviewComment" TEXT NULL, "ReviewedAt" TEXT NULL,
"CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL,
CONSTRAINT "FK_DegreeAwardResults_DegreeAwardBatches_DegreeAwardBatchId"
FOREIGN KEY ("DegreeAwardBatchId") REFERENCES "DegreeAwardBatches" ("Id") ON DELETE CASCADE,
CONSTRAINT "FK_DegreeAwardResults_Students_StudentId"
FOREIGN KEY ("StudentId") REFERENCES "Students" ("Id") ON DELETE RESTRICT,
CONSTRAINT "FK_DegreeAwardResults_GraduationAuditResults_GraduationAuditResultId"
FOREIGN KEY ("GraduationAuditResultId") REFERENCES "GraduationAuditResults" ("Id") ON DELETE RESTRICT
);
""",
"""CREATE UNIQUE INDEX IF NOT EXISTS "IX_DegreeAwardResults_DegreeAwardBatchId_StudentId" ON "DegreeAwardResults" ("DegreeAwardBatchId", "StudentId");""",
"""CREATE INDEX IF NOT EXISTS "IX_DegreeAwardResults_StudentId" ON "DegreeAwardResults" ("StudentId");""",
"""CREATE INDEX IF NOT EXISTS "IX_DegreeAwardResults_GraduationAuditResultId" ON "DegreeAwardResults" ("GraduationAuditResultId");""",
"""CREATE INDEX IF NOT EXISTS "IX_DegreeAwardResults_Conclusion_IsOverridden" ON "DegreeAwardResults" ("Conclusion", "IsOverridden");"""
];
private static readonly string[] GraduationClearanceStatements =
[
"""
CREATE TABLE IF NOT EXISTS "GraduationClearanceBatches" (
"Id" TEXT NOT NULL CONSTRAINT "PK_GraduationClearanceBatches" PRIMARY KEY,
"Name" TEXT NOT NULL, "GraduationYear" INTEGER NOT NULL,
"Status" INTEGER NOT NULL, "Notes" TEXT NULL, "ClosedAt" TEXT NULL,
"CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL
);
""",
"""CREATE INDEX IF NOT EXISTS "IX_GraduationClearanceBatches_GraduationYear_Status" ON "GraduationClearanceBatches" ("GraduationYear", "Status");""",
"""
CREATE TABLE IF NOT EXISTS "GraduationClearanceItems" (
"Id" TEXT NOT NULL CONSTRAINT "PK_GraduationClearanceItems" PRIMARY KEY,
"GraduationClearanceBatchId" TEXT NOT NULL, "Code" TEXT NOT NULL,
"Name" TEXT NOT NULL, "ResponsibleUnit" TEXT NOT NULL,
"ResponsibleRole" TEXT NOT NULL, "IsRequired" INTEGER NOT NULL,
"SortOrder" INTEGER NOT NULL, "CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL,
CONSTRAINT "FK_GraduationClearanceItems_GraduationClearanceBatches_GraduationClearanceBatchId"
FOREIGN KEY ("GraduationClearanceBatchId") REFERENCES "GraduationClearanceBatches" ("Id") ON DELETE CASCADE
);
""",
"""CREATE UNIQUE INDEX IF NOT EXISTS "IX_GraduationClearanceItems_GraduationClearanceBatchId_Code" ON "GraduationClearanceItems" ("GraduationClearanceBatchId", "Code");""",
"""
CREATE TABLE IF NOT EXISTS "GraduationClearanceRecords" (
"Id" TEXT NOT NULL CONSTRAINT "PK_GraduationClearanceRecords" PRIMARY KEY,
"GraduationClearanceItemId" TEXT NOT NULL, "StudentId" TEXT NOT NULL,
"Status" INTEGER NOT NULL, "Notes" TEXT NULL, "CompletedAt" TEXT NULL,
"CompletedByUserId" TEXT NULL, "CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL,
CONSTRAINT "FK_GraduationClearanceRecords_GraduationClearanceItems_GraduationClearanceItemId"
FOREIGN KEY ("GraduationClearanceItemId") REFERENCES "GraduationClearanceItems" ("Id") ON DELETE CASCADE,
CONSTRAINT "FK_GraduationClearanceRecords_Students_StudentId"
FOREIGN KEY ("StudentId") REFERENCES "Students" ("Id") ON DELETE RESTRICT
);
""",
"""CREATE UNIQUE INDEX IF NOT EXISTS "IX_GraduationClearanceRecords_GraduationClearanceItemId_StudentId" ON "GraduationClearanceRecords" ("GraduationClearanceItemId", "StudentId");""",
"""CREATE INDEX IF NOT EXISTS "IX_GraduationClearanceRecords_StudentId_Status" ON "GraduationClearanceRecords" ("StudentId", "Status");"""
];
private static readonly string[] CourseCategoriesStatements =
[
"""
CREATE TABLE IF NOT EXISTS "CourseCategories" (
"Id" TEXT NOT NULL CONSTRAINT "PK_CourseCategories" PRIMARY KEY,
"Code" TEXT NOT NULL,
"Name" TEXT NOT NULL,
"SortOrder" INTEGER NOT NULL,
"IsEnabled" INTEGER NOT NULL,
"CreatedAt" TEXT NOT NULL,
"UpdatedAt" TEXT NOT NULL
);
""",
"""
CREATE UNIQUE INDEX IF NOT EXISTS "IX_CourseCategories_Code"
ON "CourseCategories" ("Code");
""",
"""
CREATE INDEX IF NOT EXISTS "IX_CourseCategories_IsEnabled_SortOrder"
ON "CourseCategories" ("IsEnabled", "SortOrder");
""",
"""
ALTER TABLE "Courses" ADD COLUMN "CourseCategoryId" TEXT NULL;
""",
"""
CREATE INDEX IF NOT EXISTS "IX_Courses_CourseCategoryId"
ON "Courses" ("CourseCategoryId");
"""
];
private static readonly string[] SchedulingOptimizationStatements =
[
"""
CREATE TABLE "ScheduleEntries_New" (
"Id" TEXT NOT NULL CONSTRAINT "PK_ScheduleEntries" PRIMARY KEY,
"SchedulePlanId" TEXT NOT NULL,
"TeachingTaskId" TEXT NOT NULL,
"ClassroomId" TEXT NULL,
"DayOfWeek" INTEGER NOT NULL,
"StartPeriod" INTEGER NOT NULL,
"PeriodCount" INTEGER NOT NULL,
"StartWeek" INTEGER NOT NULL,
"EndWeek" INTEGER NOT NULL,
"WeekPattern" INTEGER NOT NULL,
"Notes" TEXT NULL,
"CreatedAt" TEXT NOT NULL,
"UpdatedAt" TEXT NOT NULL,
CONSTRAINT "FK_ScheduleEntries_SchedulePlans_SchedulePlanId"
FOREIGN KEY ("SchedulePlanId") REFERENCES "SchedulePlans" ("Id")
ON DELETE CASCADE,
CONSTRAINT "FK_ScheduleEntries_TeachingTasks_TeachingTaskId"
FOREIGN KEY ("TeachingTaskId") REFERENCES "TeachingTasks" ("Id")
ON DELETE RESTRICT,
CONSTRAINT "FK_ScheduleEntries_Classrooms_ClassroomId"
FOREIGN KEY ("ClassroomId") REFERENCES "Classrooms" ("Id")
ON DELETE SET NULL
);
""",
"""
INSERT INTO "ScheduleEntries_New"
SELECT "Id", "SchedulePlanId", "TeachingTaskId", "ClassroomId",
"DayOfWeek", "StartPeriod", "PeriodCount", "StartWeek", "EndWeek",
"WeekPattern", "Notes", "CreatedAt", "UpdatedAt"
FROM "ScheduleEntries";
""",
"""DROP TABLE "ScheduleEntries";""",
"""ALTER TABLE "ScheduleEntries_New" RENAME TO "ScheduleEntries";""",
"""
CREATE INDEX "IX_ScheduleEntries_SchedulePlanId_DayOfWeek_StartPeriod"
ON "ScheduleEntries" ("SchedulePlanId", "DayOfWeek", "StartPeriod");
""",
"""
CREATE INDEX "IX_ScheduleEntries_TeachingTaskId"
ON "ScheduleEntries" ("TeachingTaskId");
""",
"""
CREATE INDEX "IX_ScheduleEntries_ClassroomId"
ON "ScheduleEntries" ("ClassroomId");
""",
"""
CREATE TABLE "ScheduleTimeSlots" (
"Id" TEXT NOT NULL CONSTRAINT "PK_ScheduleTimeSlots" PRIMARY KEY,
"AcademicTermId" TEXT NOT NULL,
"PeriodNumber" INTEGER NOT NULL,
"Name" TEXT NOT NULL,
"StartsAt" TEXT NOT NULL,
"EndsAt" TEXT NOT NULL,
"IsEnabled" INTEGER NOT NULL,
"CreatedAt" TEXT NOT NULL,
"UpdatedAt" TEXT NOT NULL,
CONSTRAINT "FK_ScheduleTimeSlots_AcademicTerms_AcademicTermId"
FOREIGN KEY ("AcademicTermId") REFERENCES "AcademicTerms" ("Id")
ON DELETE CASCADE
);
""",
"""
CREATE UNIQUE INDEX "IX_ScheduleTimeSlots_AcademicTermId_PeriodNumber"
ON "ScheduleTimeSlots" ("AcademicTermId", "PeriodNumber");
""",
"""
CREATE TABLE "TeachingTaskScheduleConstraints" (
"Id" TEXT NOT NULL CONSTRAINT "PK_TeachingTaskScheduleConstraints" PRIMARY KEY,
"TeachingTaskId" TEXT NOT NULL,
"RequiresClassroom" INTEGER NOT NULL,
"RequiredCampusId" TEXT NULL,
"RequiredBuildingId" TEXT NULL,
"AllowedDayOfWeeks" TEXT NULL,
"EarliestPeriod" INTEGER NULL,
"LatestPeriod" INTEGER NULL,
"CreatedAt" TEXT NOT NULL,
"UpdatedAt" TEXT NOT NULL,
CONSTRAINT "FK_TeachingTaskScheduleConstraints_TeachingTasks_TeachingTaskId"
FOREIGN KEY ("TeachingTaskId") REFERENCES "TeachingTasks" ("Id")
ON DELETE CASCADE,
CONSTRAINT "FK_TeachingTaskScheduleConstraints_Campuses_RequiredCampusId"
FOREIGN KEY ("RequiredCampusId") REFERENCES "Campuses" ("Id")
ON DELETE RESTRICT,
CONSTRAINT "FK_TeachingTaskScheduleConstraints_Buildings_RequiredBuildingId"
FOREIGN KEY ("RequiredBuildingId") REFERENCES "Buildings" ("Id")
ON DELETE RESTRICT
);
""",
"""
CREATE UNIQUE INDEX "IX_TeachingTaskScheduleConstraints_TeachingTaskId"
ON "TeachingTaskScheduleConstraints" ("TeachingTaskId");
""",
"""
CREATE INDEX "IX_TeachingTaskScheduleConstraints_RequiredCampusId"
ON "TeachingTaskScheduleConstraints" ("RequiredCampusId");
""",
"""
CREATE INDEX "IX_TeachingTaskScheduleConstraints_RequiredBuildingId"
ON "TeachingTaskScheduleConstraints" ("RequiredBuildingId");
""",
"""
CREATE TABLE "TeachingTaskAllowedClassrooms" (
"TeachingTaskScheduleConstraintId" TEXT NOT NULL,
"ClassroomId" TEXT NOT NULL,
CONSTRAINT "PK_TeachingTaskAllowedClassrooms"
PRIMARY KEY ("TeachingTaskScheduleConstraintId", "ClassroomId"),
CONSTRAINT "FK_TeachingTaskAllowedClassrooms_Constraints"
FOREIGN KEY ("TeachingTaskScheduleConstraintId")
REFERENCES "TeachingTaskScheduleConstraints" ("Id")
ON DELETE CASCADE,
CONSTRAINT "FK_TeachingTaskAllowedClassrooms_Classrooms_ClassroomId"
FOREIGN KEY ("ClassroomId") REFERENCES "Classrooms" ("Id")
ON DELETE RESTRICT
);
""",
"""
CREATE INDEX "IX_TeachingTaskAllowedClassrooms_ClassroomId"
ON "TeachingTaskAllowedClassrooms" ("ClassroomId");
"""
];
}