ManualApplyPreview 實作前確認

本頁為專案文件網站產出的閱讀版。

返回 docs

ManualApplyPreview 實作前確認

本文件承接 MySQL Schema Apply / DDL Executor 安全策略第三階段前置規劃第三階段執行儀表板,用來整理第三階段 3B ManualApplyPreview 進入程式 repo 前必須先確認的範圍、資料模型、風險分類、輸出格式與驗證方式。

本文件只做實作前確認與後續回填,不代表已同意實作正式 DDL Executor、執行 CREATE TABLE / ALTER TABLE / DROP、修改 ConsoleHost 啟動流程、導入 ServiceHost / WebApi、保存 DB 密碼或連線字串。

1. 目前可用基礎

項目狀態說明
Schema Attribute已完成task_executionsnode_executionstask_log_traces 已可由 C# class 維護欄位、索引與 comment。
SQL Generator已完成可產生 MySQL 5.6.2 相容 SQL preview。
Schema Inspector已完成可讀取 expected / current schema;真實 MySQL metadata inspect 採 manual-only。
Dry Run Planner已完成可產生 schema 差異與 SQL preview,不執行 DDL。
ConsoleHost DryRun 顯示已完成目前只顯示 preview 與警告,不具備 apply 能力。
Apply 安全策略已完成已整理 gate、權限、備份、rollback、plan hash、高風險分類與停止線。
3A Trace 查詢已完成已完成 ITaskTraceStore、MySQL read-side、manual-only 查詢與 write/read/cleanup 補驗。

2. 本次 3B 目標

ManualApplyPreview 的目標是把「可以檢查 schema 差異」推進到「可以產生可審核的 apply plan」,但仍不執行任何 DDL。

目標說明
固定 preview model先定義 apply plan、operation、risk、warning、plan hash 等資料邊界。
固定高風險分類明確標記 DROP、MODIFY、CHANGE、縮短欄位、NOT NULL 無 default、大表 index 等風險。
固定輸出格式讓 ConsoleHost / 未來 ServiceHost 能顯示可人工審核的摘要。
固定停止線確認 preview 階段不得執行 DDL、不得保存敏感資訊、不得改啟動流程。
固定驗證方式先以 fake schema / dry-run result 測試 preview,不連正式 DB。

3. 建議實作範圍

範圍建議備註
功能名稱ManualApplyPreview表示「人工審核前的 apply preview」,不是 apply executor。
主要職責接收 dry-run 差異,產生 apply plan 與風險摘要不直接碰 DB connection。
DB 行為不執行 DDL即使有 SQL preview,也只輸出文字與風險。
輸出對象ConsoleHost / 後續 ServiceHost 顯示用本次不新增 ServiceHost。
儲存行為第一版不寫入 schema_apply_history是否建立 history table 需另行確認。
專案位置需進程式 repo 後比對現有 Schema namespace不在文件階段直接決定 class 位置。

4. 建議不納入本次

5. Input model 候選欄位

以下只作為討論草案,不是最終 public contract:

欄位必填用途
TargetDatabaseName目標 DB 名稱,輸出時只顯示 database,不顯示 host / password。
ExpectedSchema由 schema class 產生的預期 schema。
CurrentSchema由 inspector 讀取的目前 schema;若沒有 current schema,只能產生 limited preview。
DryRunPlan既有 Dry Run Planner 產出的差異與 SQL preview。
GeneratedBy產生 preview 的 operator 或 host 名稱,不得放密碼或 token。
Reason人工審核原因,例如初始化測試 DB、檢查 schema 差異。
SourceCommit程式 repo commit,方便追蹤 schema class 版本。
AppVersionHost 或工具版本。
GeneratedAt產生時間,若未提供由系統填入。

6. Apply plan 候選欄位

欄位用途
PlanId本次 preview 識別碼,可用 deterministic 或 GUID。
Mode固定為 ManualApplyPreview
TargetDatabaseName目標 DB 名稱,避免包含 host / password。
GeneratedAt產生時間。
GeneratedBy操作者或 host 名稱。
SourceCommitschema class 對應 commit。
Operations每一個 table / column / index / comment 差異。
Warnings需要人工注意但不一定阻擋 preview 的警告。
BlockedReasons會阻止進一步 apply 的原因。
HighestRiskLevel本次 plan 最高風險等級。
RequiresBackup是否需備份。
RequiresMaintenanceWindow是否建議維運窗口。
SqlPreview已遮蔽且可人工審核的 SQL preview。
PlanHash用於後續人工確認 token,不得寫死。
CanApply第一版建議固定為 false,表示此功能只做 preview。

7. Operation model 候選欄位

欄位用途
OperationType例如 CreateTableAddColumnAddIndexUpdateCommentDropColumn
TableName目標 table。
ObjectName欄位、index 或 comment 目標名稱。
Before目前 schema 摘要。
After預期 schema 摘要。
SqlPreview單一 operation 對應 SQL。
RiskLevelLowMediumHighCritical
RiskReasons為何判定此風險。
RequiresBackup此 operation 是否需要備份。
IsDestructive是否可能破壞或刪除資料。
IsBlocked是否應阻止後續 apply。

8. 風險分類建議

操作建議風險Preview 處理
CREATE TABLEMedium可列入 preview,標示需確認目標 DB。
ADD COLUMN nullableMedium可列入 preview。
ADD COLUMN not null with defaultHigh需提醒可能鎖表或回填成本。
ADD COLUMN not null without defaultCritical應列為 blocked。
ADD INDEXMedium / High小表可 Medium,大表或未知資料量應 High。
UPDATE COMMENTLow可列入 preview,但需注意 MySQL 5.6.2 comment 限制。
MODIFY COLUMNCritical應列為 blocked,需另案確認。
CHANGE COLUMNCritical應列為 blocked,需另案確認。
DROP INDEXHigh第一版建議 blocked。
DROP COLUMNCritical必須 blocked。
DROP TABLECritical必須 blocked。
縮短欄位長度Critical必須 blocked。
改 nullable from true to falseHigh / Critical若無 backfill 策略,應 blocked。

9. Preview 驗證規則

規則建議處理
沒有 dry-run plan回傳 validation error,不產生 apply preview。
SQL preview 為空但有差異回傳 validation error,避免 plan 不完整。
目標 DB 名稱缺少回傳 validation error。
operation 無 table name回傳 validation error。
operation 包含 DROPpreview 可列出,但 IsBlocked=true
operation 包含 destructive keywordHighestRiskLevel 至少為 Critical
SQL preview 含 password / token / secret / connection string回傳 validation error 或遮罩後加 warning;建議第一版直接擋下。
plan hash 無法產生回傳 error,不允許進一步人工確認。

10. Plan hash 規則

PlanHash 是後續人工確認 token 的基礎,需能反映本次 preview 的實際內容。

建議 hash 納入:

第一版建議先不把 DB password、host、port 或 operator 私密資訊納入 hash。

11. ConsoleHost 顯示草案

ConsoleHost 若後續接入 preview,建議只顯示:

區塊內容
Summarymode、target database、operation count、highest risk、can apply。
Blocked reasons為何本次不能 apply。
Operationstable、object、operation type、risk、blocked。
SQL preview可人工審核的 SQL,需遮罩敏感資訊。
Warnings備份、維運窗口、MySQL 5.6.2 限制。
Plan hash後續人工確認用,不代表本次會 apply。

ConsoleHost 顯示不得包含:

12. 測試計畫

測試類型目的
Preview request validator test驗證缺少 dry-run plan、缺 target、operation 不完整會失敗。
Risk classifier test驗證 DROP、MODIFY、CHANGE、縮短欄位等會被標成 Critical。
Plan hash test驗證相同 plan 產生相同 hash,plan 改變時 hash 改變。
Sensitive output test驗證 SQL preview / warning / error 不含 password、token、connection string。
Formatter test驗證 ConsoleHost 顯示摘要、風險、blocked reasons 與 plan hash。
No DDL execution test驗證 preview path 不呼叫任何 DDL executor 或 DB apply gateway。

13. 停止線

以下項目不得在未確認前執行:

14. 進程式 repo 前需確認

決策項建議是否已定案
第一版是否只做 preview只做 ManualApplyPreview,不做 DDL executor已確認
CanApply 第一版行為固定 false已確認
風險等級使用 LowMediumHighCritical已確認
Critical operation允許列出但一律 blocked已確認
Plan hash由 preview 內容產生,不含密碼與連線資訊已確認
ConsoleHost 接入第一版只新增 formatter / demo,不改預設啟動流程已確認
History table第一版不建立、不寫入已確認

15. 建議下一步

使用者已依 3B ManualApplyPreview 決策確認表 確認以下 7 點:

  1. 3B 第一版只做 ManualApplyPreview,不做 DDL executor。
  2. 第一版 CanApply 固定為 false
  3. 風險等級採 LowMediumHighCritical
  4. DROPMODIFYCHANGE、縮短欄位、NOT NULL 無 default 一律列為 blocked。
  5. PlanHash 由 preview 內容產生,不包含密碼、host、port 或完整連線資訊。
  6. 若接入 ConsoleHost,第一版只顯示 preview,不改預設啟動流程。
  7. 第一版不建立 schema_apply_historyschema_migrations table。

程式 repo 已依上述決策完成第一版 ManualApplyPreview 安全預覽,對應 commit 13c14ca。後續下一步不再是結構檢查,而是整理 3B 完成稽核,或另行確認後執行真實 DB read-only preview 驗證。

16. 實作完成回填(2026-06-04)

項目結果
程式 repo commit13c14ca新增 ManualApplyPreview 安全預覽
Preview model已完成 request、result、item、risk level model
Preview builder已完成 SchemaManualApplyPreviewBuilder
CanApply第一版固定 false
風險等級已使用 LowMediumHighCritical
Critical blocked已將危險或未知操作標為 blocked
PlanHash已由 preview 內容產生,不含密碼與完整連線資訊
ConsoleHost已顯示 preview 摘要、風險、blocked、plan hash 與 SQL preview
History table未建立、未寫入

17. 驗證回填

驗證項目結果
Core SchemaManualApplyPreviewBuilderTests9 passed
ConsoleHost formatter 測試15 passed
MySQL manual-only gate 測試1 passed
ConsoleHost 實際輸出dotnet run 成功輸出 PlanHashCanApply=FalseRisk=LowBlocked=False
污染字串掃描repo 內未找到污染字串
舊命名掃描未找到 SafeCreateSafeAddColumnMediumAddIndexManualReviewRequiredCanExecuteAutomaticallyAutoExecute

18. 後續仍需停止

19. 建議下一步

建議整理「3B 完成稽核表」,把第一版實作、驗證結果、停止線與剩餘風險一次收斂;若要進一步碰真實 DB,應另行建立 read-only preview 驗證節點。