-- Bind only uniquely proven, active exact paths. Unresolved historical rows stay -- visible for review; no name guessing or automatic permission assignment. BEGIN; ALTER TABLE "material_permission_pack_departments" ADD COLUMN "organization_unit_id" TEXT; WITH unique_paths AS ( SELECT path, MIN(id) AS id FROM organization_units WHERE is_active = TRUE GROUP BY path HAVING COUNT(*) = 1 ) UPDATE material_permission_pack_departments AS membership SET organization_unit_id = unit.id FROM unique_paths AS unit WHERE membership.department_path = unit.path; CREATE UNIQUE INDEX "material_permission_pack_dept_unit_key" ON "material_permission_pack_departments"("organization_unit_id"); CREATE INDEX "material_permission_pack_departments_pack_id_idx" ON "material_permission_pack_departments"("pack_id"); ALTER TABLE "material_permission_pack_departments" ADD CONSTRAINT "material_permission_pack_departments_organization_unit_id_fkey" FOREIGN KEY ("organization_unit_id") REFERENCES "organization_units"("id") ON DELETE RESTRICT ON UPDATE CASCADE; DROP INDEX "material_permission_pack_dept_pack_path_key"; DROP INDEX "material_permission_pack_dept_path_key"; COMMIT;