[CLAUDE] Scripts Docs: Chunk R — Cleanup destructive prod database (52 rows + ~600 cascade child)
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 3m27s

Bro UAT confirm Plan P+Q wire OK + chỉ thị cleanup test data:
> "OK Tao thấy tạm ổn rồi đấy, mày xóa hết các phiếu test cũ đi nhé,
> các quy trình cũ ko ghim cũng xóa hết đi. Cho gọn đẹp."

Investigator pre-flight audit prod DB ~64K spawn confirm scope:
- 35 PE rows total (28 active + 7 soft-deleted)
- 17 ApprovalWorkflowsV2 (15 IsUserSelectable=false + 2 ghim+active)
- 4 PurchaseEvaluationWorkflowDefinitions V1 (2 IsActive=false + 2 active)

Critical gotchas:
1. PE.ApprovalWorkflowId FK Restrict → soft-delete KHÔNG release FK,
   hard-DELETE PE first
2. ApprovalWorkflow extend BaseEntity (NO soft-delete) → hard DELETE only
3. Filtered indexes Mig 29+ require SET QUOTED_IDENTIFIER ON
4. SQL Express constraints: NO BACKUP COMPRESSION + RESTORE VERIFYONLY
   require sysadmin (vrapp KHÔNG có)

Execute via scripts/plan-r-*.sql upload scp + sqlcmd -i workflow:

Step 1+2 — BACKUP DATABASE:
- C:\Backup\SolutionErp_pre_cleanup_2026-05-15.bak (18.5MB, 2249 pages)
- Verified via Get-Item file size

Step 3-5 — 3 separate transactions DELETE:
- 28 PE active + 7 soft-deleted → cascade 446 child rows
  (42 Details + 49 Suppliers + 64 Approvals + 238 Changelogs +
   10 Attachments + 43 LevelOpinions)
- 15 V2 workflows unghim → cascade ~140 Steps+Levels
- 2 V1 workflows inactive → cascade ~37 Steps+Approvers

Total: 52 rows direct + ~600 cascade child = ~650+ rows wiped.

Step 6 — Verify post-cleanup state:
- PE total: 35 → 0 ✓
- V2 workflows: 17 → 2 (QT-DN-V2-001 v16 + QT-DN-PA-V2-001 v2 ghim+active)
- V1 workflows: 4 → 2 (QT-DN-A v3 + QT-DN-B v1 active, PE pin protected)

Step 7 — BE smoke verify alive post-cleanup:
- /api/auth/login → 200
- /api/purchase-evaluations → 200
- /api/approval-workflows-v2 → 200
- /api/pe-workflows → 200
→ KHÔNG crash startup (Plan F precedent avoid được)

Multi-agent ROI: Investigator save em main hard-delete blind without
backup + catch SQL Express constraint + catch FK Restrict gotcha.

Pattern reinforced:
- Destructive operation prod BẮT BUỘC pre-flight audit + backup + verify
- scp + sqlcmd -i workflow cho complex SQL trên prod (avoid shell escape
  hell qua SSH PowerShell)
- Plan F precedent: KHÔNG drop active workflow (PE pin → BE crash)

Stats final S23 t8:
- 31 mig · 59 tables · ~145 endpoints · 34 FE pages · 111 test unchanged
- 47 gotcha · 20 memory · 6 skills · 4 sub-agents
- **0 PE phiếu test + 4 workflow ghim/active** — UAT clean slate
- Backup rollback ready: vietreport-vps:C:\Backup\SolutionErp_pre_cleanup_2026-05-15.bak

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
pqhuy1987
2026-05-15 14:11:56 +07:00
parent 108268a2e2
commit 5cbf516a78
5 changed files with 281 additions and 2 deletions

View File

@ -0,0 +1,98 @@
-- Plan R S23 t8 (2026-05-15) — Destructive cleanup prod
-- Bro request 2026-05-15: "xóa hết các phiếu test cũ + quy trình cũ ko ghim cũng xóa hết"
-- Pre-flight Investigator audit: 28 PE active + 15 V2 unghim + 2 V1 inactive workflows
-- Backup: C:\Backup\SolutionErp_pre_cleanup_2026-05-15.bak (18.5MB verified)
USE SolutionErp;
GO
-- Filtered indexes require QUOTED_IDENTIFIER ON + ANSI_NULLS ON (Mig 29+ FilteredIndex)
SET QUOTED_IDENTIFIER ON;
SET ANSI_NULLS ON;
GO
PRINT '=== Plan R cleanup execute START ===';
PRINT 'Pre-cleanup state:';
SELECT 'PE active' AS Entity, COUNT(*) AS Cnt FROM PurchaseEvaluations WHERE IsDeleted = 0
UNION ALL SELECT 'PE soft-deleted', COUNT(*) FROM PurchaseEvaluations WHERE IsDeleted = 1
UNION ALL SELECT 'V2 workflow total', COUNT(*) FROM ApprovalWorkflows
UNION ALL SELECT 'V2 unghim (target)', COUNT(*) FROM ApprovalWorkflows WHERE IsUserSelectable = 0
UNION ALL SELECT 'V2 ghim (KEEP)', COUNT(*) FROM ApprovalWorkflows WHERE IsUserSelectable = 1
UNION ALL SELECT 'V1 workflow total', COUNT(*) FROM PurchaseEvaluationWorkflowDefinitions
UNION ALL SELECT 'V1 inactive (target)', COUNT(*) FROM PurchaseEvaluationWorkflowDefinitions WHERE IsActive = 0
UNION ALL SELECT 'V1 active (KEEP)', COUNT(*) FROM PurchaseEvaluationWorkflowDefinitions WHERE IsActive = 1;
PRINT '';
PRINT '=== Step 3: DELETE 28 PE active (cascade 446 child rows) ===';
BEGIN TRY
BEGIN TRANSACTION DeletePE;
DELETE FROM PurchaseEvaluations WHERE IsDeleted = 0;
DECLARE @PEDeleted INT = @@ROWCOUNT;
PRINT 'PE active rows deleted: ' + CAST(@PEDeleted AS NVARCHAR(10));
-- Also clear soft-deleted ones for clean slate
DELETE FROM PurchaseEvaluations WHERE IsDeleted = 1;
DECLARE @PESoftDeleted INT = @@ROWCOUNT;
PRINT 'PE soft-deleted rows deleted: ' + CAST(@PESoftDeleted AS NVARCHAR(10));
COMMIT TRANSACTION DeletePE;
PRINT 'Step 3 COMMIT OK';
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION DeletePE;
PRINT 'Step 3 FAILED — rollback. Error: ' + ERROR_MESSAGE();
THROW;
END CATCH;
PRINT '';
PRINT '=== Step 4: DELETE 15 V2 workflows unghim (cascade Steps + Levels) ===';
BEGIN TRY
BEGIN TRANSACTION DeleteV2;
DELETE FROM ApprovalWorkflows WHERE IsUserSelectable = 0;
DECLARE @V2Deleted INT = @@ROWCOUNT;
PRINT 'V2 workflows deleted: ' + CAST(@V2Deleted AS NVARCHAR(10));
COMMIT TRANSACTION DeleteV2;
PRINT 'Step 4 COMMIT OK';
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION DeleteV2;
PRINT 'Step 4 FAILED — rollback. Error: ' + ERROR_MESSAGE();
THROW;
END CATCH;
PRINT '';
PRINT '=== Step 5: DELETE 2 V1 workflows inactive (cascade Steps + Approvers) ===';
BEGIN TRY
BEGIN TRANSACTION DeleteV1;
DELETE FROM PurchaseEvaluationWorkflowDefinitions WHERE IsActive = 0;
DECLARE @V1Deleted INT = @@ROWCOUNT;
PRINT 'V1 workflows deleted: ' + CAST(@V1Deleted AS NVARCHAR(10));
COMMIT TRANSACTION DeleteV1;
PRINT 'Step 5 COMMIT OK';
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION DeleteV1;
PRINT 'Step 5 FAILED — rollback. Error: ' + ERROR_MESSAGE();
THROW;
END CATCH;
PRINT '';
PRINT '=== Post-cleanup verify ===';
SELECT 'PE total (expect 0)' AS Entity, COUNT(*) AS Cnt FROM PurchaseEvaluations
UNION ALL SELECT 'V2 workflow total (expect 2 ghim)', COUNT(*) FROM ApprovalWorkflows
UNION ALL SELECT 'V2 ghim remaining', COUNT(*) FROM ApprovalWorkflows WHERE IsUserSelectable = 1 AND IsActive = 1
UNION ALL SELECT 'V1 workflow total (expect 2 active)', COUNT(*) FROM PurchaseEvaluationWorkflowDefinitions
UNION ALL SELECT 'V1 active remaining', COUNT(*) FROM PurchaseEvaluationWorkflowDefinitions WHERE IsActive = 1;
PRINT '';
PRINT 'Remaining V2 workflows (ghim+active):';
SELECT Code, Version, ApplicableType, IsActive, IsUserSelectable, Name FROM ApprovalWorkflows ORDER BY Code, Version DESC;
PRINT '';
PRINT 'Remaining V1 workflows:';
SELECT Code, Version, EvaluationType, IsActive, Name FROM PurchaseEvaluationWorkflowDefinitions ORDER BY Code, Version DESC;
PRINT '';
PRINT '=== Plan R cleanup execute END ===';