diff --git a/migrations/117_queue_active_unique.sql b/migrations/117_queue_active_unique.sql index 087c414..beb7665 100644 --- a/migrations/117_queue_active_unique.sql +++ b/migrations/117_queue_active_unique.sql @@ -7,30 +7,12 @@ WHERE a.document_id = b.document_id AND a.started_at < NOW() - INTERVAL '10 minutes' AND b.status = 'pending'; --- Step 2: guard check — 활성 중복이 남아있으면 migration 중단 -DO $$ -DECLARE - dup_count INTEGER; -BEGIN - SELECT COUNT(*) INTO dup_count - FROM ( - SELECT document_id, stage - FROM processing_queue - WHERE status IN ('pending', 'processing') - GROUP BY document_id, stage - HAVING COUNT(*) > 1 - ) sub; - - IF dup_count > 0 THEN - RAISE EXCEPTION 'migration 117 blocked: % active duplicate(s) remain. Run manual cleanup first.', dup_count; - END IF; -END $$; - --- Step 3: 기존 constraint 제거 +-- Step 2: 기존 constraint 제거 ALTER TABLE processing_queue DROP CONSTRAINT processing_queue_document_id_stage_status_key; --- Step 4: partial unique index (활성 행은 (document_id, stage)당 최대 1개) +-- Step 3: partial unique index (활성 행은 (document_id, stage)당 최대 1개) +-- 활성 중복이 남아있으면 여기서 자연스럽게 실패 → 수동 정리 후 재시도 CREATE UNIQUE INDEX uq_queue_active ON processing_queue (document_id, stage) WHERE status IN ('pending', 'processing');