From aebe5bc57db5a27c30240b89be9890110929fc0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hartmut=20N=C3=B6renberg?= Date: Thu, 9 Apr 2026 14:03:11 +0200 Subject: [PATCH] =?UTF-8?q?fix(db):=20add=20SetNull=20cascade=20on=20Assig?= =?UTF-8?q?nment=E2=86=92DemandRequirement=20+=20composite=20indexes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Prevents orphaned Assignment rows when a DemandRequirement is deleted. Adds (resourceId, status, endDate) and (projectId, status, endDate) indexes to support capacity range queries. Co-Authored-By: Claude Sonnet 4.6 --- .../migrations/20260409_assignment_composite_indexes.sql | 4 ++++ .../20260409_assignment_demand_requirement_cascade.sql | 7 +++++++ packages/db/prisma/schema.prisma | 4 +++- 3 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 packages/db/prisma/migrations/20260409_assignment_composite_indexes.sql create mode 100644 packages/db/prisma/migrations/20260409_assignment_demand_requirement_cascade.sql diff --git a/packages/db/prisma/migrations/20260409_assignment_composite_indexes.sql b/packages/db/prisma/migrations/20260409_assignment_composite_indexes.sql new file mode 100644 index 0000000..126b176 --- /dev/null +++ b/packages/db/prisma/migrations/20260409_assignment_composite_indexes.sql @@ -0,0 +1,4 @@ +-- Migration: Add composite indexes on Assignment for capacity range queries + +CREATE INDEX IF NOT EXISTS "assignments_resourceId_status_endDate_idx" ON "assignments"("resourceId", "status", "endDate"); +CREATE INDEX IF NOT EXISTS "assignments_projectId_status_endDate_idx" ON "assignments"("projectId", "status", "endDate"); diff --git a/packages/db/prisma/migrations/20260409_assignment_demand_requirement_cascade.sql b/packages/db/prisma/migrations/20260409_assignment_demand_requirement_cascade.sql new file mode 100644 index 0000000..13695ea --- /dev/null +++ b/packages/db/prisma/migrations/20260409_assignment_demand_requirement_cascade.sql @@ -0,0 +1,7 @@ +-- Migration: Add SetNull cascade on Assignment → DemandRequirement FK +-- When a DemandRequirement is deleted, assignments lose their reference but are not deleted. + +ALTER TABLE "assignments" DROP CONSTRAINT IF EXISTS "assignments_demandRequirementId_fkey"; +ALTER TABLE "assignments" ADD CONSTRAINT "assignments_demandRequirementId_fkey" + FOREIGN KEY ("demandRequirementId") REFERENCES "demand_requirements"("id") + ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/packages/db/prisma/schema.prisma b/packages/db/prisma/schema.prisma index 5bea42d..5340b09 100644 --- a/packages/db/prisma/schema.prisma +++ b/packages/db/prisma/schema.prisma @@ -1330,7 +1330,7 @@ model Assignment { status AllocationStatus @default(PROPOSED) metadata Json @db.JsonB @default("{}") - demandRequirement DemandRequirement? @relation(fields: [demandRequirementId], references: [id]) + demandRequirement DemandRequirement? @relation(fields: [demandRequirementId], references: [id], onDelete: SetNull) resource Resource @relation(fields: [resourceId], references: [id]) project Project @relation(fields: [projectId], references: [id]) roleEntity Role? @relation(fields: [roleId], references: [id]) @@ -1346,6 +1346,8 @@ model Assignment { @@index([status]) @@index([resourceId, status, startDate]) @@index([projectId, startDate, endDate]) + @@index([resourceId, status, endDate]) + @@index([projectId, status, endDate]) @@map("assignments") }