ALTER TABLE / Schema Initializer 實作前確認

確認 ALTER TABLE、Schema Initializer、Dry Run 與真實 MySQL 連線的自動化分級與禁止範圍。

返回 docs

ALTER TABLE / Schema Initializer 實作前確認

1. 文件目的

本文件用來確認 MySqlSchemaSqlGenerator 第一版完成後,是否可以進入下一個節點:ALTER TABLE / Schema Initializer

目前已完成的範圍是:

本文件要先釐清:

2. 自動化分級規則

分級定義Codex 是否可自動執行
A:可自動執行只影響文件、測試、純字串產生器、Dry Run 格式、非真實 DB 的單元測試可以
B:需先回報但可建議預設方案可能影響實作方向,但尚未碰真實 DB、套件或 public contract先回報確認點,再依已確認方向執行
C:必須停下確認會改資料模型、設定檔格式、public method 簽章、新增套件、連線 MySQL、執行 DDL、修改外部服務或使用敏感資訊不可自動執行

本節點預設採用:

文件、設計、測試清單與純字串 SQL 產生器可自動化;真實 DB 連線與 DDL 執行必須停下確認。

3. 建議採用的第一版邊界

3.1 第一版允許

項目是否允許自動化分級說明
產生 ALTER TABLE ADD COLUMN SQL 字串允許A只產生字串,不執行
產生 ALTER TABLE ADD INDEX SQL 字串允許A包含一般 index 與 unique index
產生 Dry Run 報告物件允許A報告將新增 table、column、index
新增 Schema Diff 模型允許B若只是 internal model 可自動;若會變 public contract 需確認
新增單元測試允許A不需真實 DB
更新文件網站進度允許A屬文件同步

3.2 第一版禁止

項目是否禁止自動化分級原因
修改既有欄位型別禁止C可能破壞資料或造成資料截斷
刪除欄位禁止C高風險資料破壞
刪除 index禁止C可能影響查詢與現場效能
自動 rename 欄位禁止C難以可靠判斷意圖
自動建立 database禁止C涉及 DB 權限與環境邊界
自動連線正式 MySQL禁止C需要 host、port、user、password、dbname
自動執行 DDL禁止C會改動真實 DB schema

4. Schema Initializer 建議分層

建議把功能拆成三層,避免一開始就讓啟動流程碰真實 DB:

層級元件責任是否可先實作
Schema ParserSchemaDefinitionParser從 C# Class 解析 schema已完成
SQL GeneratorMySqlSchemaSqlGenerator產生 CREATE TABLE / ALTER TABLE SQL 字串可先做
Schema Plan / Dry RunMySqlSchemaPlan / SchemaMigrationPlan描述將新增哪些 table / column / index可先做
Schema InspectorMySqlSchemaInspector查詢 information_schema 取得現況需確認套件與連線
Schema InitializerMySqlSchemaInitializer組合 inspector、generator、executor需確認套件與啟動流程
Schema ExecutorMySqlSchemaExecutor實際執行 DDL必須停下確認

第一版建議先做:

  1. ALTER TABLE SQL 字串產生器。
  2. Dry Run / Plan 模型。
  3. 不連 DB 的單元測試。

暫不做:

  1. information_schema 查詢。
  2. MySQL 實際連線。
  3. DDL 執行。
  4. ConsoleHost 啟動自動建表。

5. ALTER TABLE 規則建議

5.1 新增欄位

第一版建議只支援新增缺少欄位:

ALTER TABLE `task_executions`
  ADD COLUMN `status` varchar(32) NOT NULL COMMENT '任務狀態';

規則:

5.2 新增索引

第一版建議支援新增缺少 index:

ALTER TABLE `task_executions`
  ADD INDEX `idx_task_executions_status` (`status`);

unique index:

ALTER TABLE `task_executions`
  ADD UNIQUE INDEX `uk_task_executions_workflow` (`workflow_id`, `task_id`);

規則:

5.3 不修改既有欄位

若 DB 現況欄位與 C# schema 不一致,第一版只回報差異,不自動修正:

差異第一版處理方式
型別不同報告 RequiresManualReview
nullable 不同報告 RequiresManualReview
comment 不同報告 RequiresManualReview
primary key 不同報告 RequiresManualReview
index 欄位不同但名稱相同報告 RequiresManualReview

6. Dry Run 報告格式建議

第一版 Dry Run 報告建議包含:

欄位說明
Success是否成功產生計畫
ModeDryRun / Execute,第一版只允許 DryRun
TablesToCreate預計新增的 table
ColumnsToAdd預計新增的 column
IndexesToAdd預計新增的 index
ManualReviewItems需要人工判斷的差異
SqlStatements預計產生的 SQL 字串
Warnings風險或限制提醒
Error失敗時的標準錯誤資訊

範例:

{
  "mode": "DryRun",
  "tablesToCreate": ["task_executions"],
  "columnsToAdd": ["task_executions.status"],
  "indexesToAdd": ["task_executions.idx_task_executions_status"],
  "manualReviewItems": [],
  "sqlStatements": [
    "CREATE TABLE IF NOT EXISTS `task_executions` (...)",
    "ALTER TABLE `task_executions` ADD COLUMN `status` varchar(32) NOT NULL COMMENT '任務狀態'"
  ],
  "warnings": [
    "Dry Run 不會連線或修改 MySQL。"
  ]
}

7. 實作前確認表

確認項目建議決策自動化分級是否已確認
第一版是否只產生 SQL 字串,不執行 DDLA建議確認
是否允許產生 ALTER TABLE ADD COLUMNA建議確認
是否允許產生 ALTER TABLE ADD INDEXA建議確認
是否允許修改既有欄位型別C必須確認
是否允許刪除欄位 / indexC必須確認
是否新增 Dry Run Plan 模型B建議確認
是否新增 MySqlConnector暫不新增C必須確認
是否查詢 information_schema暫不查C必須確認
是否連線真實 MySQL暫不連C必須確認
是否接 ConsoleHost 啟動流程暫不接C必須確認

8. 建議實作順序

8.1 可自動執行

  1. 新增 SchemaMigrationPlan / SchemaMigrationOperation 類型。
  2. 新增 GenerateAlterTableSql 或等效方法,但只產生 SQL 字串。
  3. 新增 Dry Run 報告模型。
  4. 新增不連 DB 的單元測試。
  5. 更新文件與進度。

8.2 需停下確認後才執行

  1. 新增 MySqlConnector
  2. 建立 MySqlSchemaInspector 查詢 information_schema
  3. 建立 MySqlSchemaExecutor 執行 DDL。
  4. 將 Schema Initializer 接入 ConsoleHost / ServiceHost / WebApi 啟動流程。
  5. 使用真實 MySQL host、port、database、user、password 測試。

9. 建議結論

建議下一步不要直接做完整 Schema Initializer,而是先做:

ALTER TABLE SQL 字串產生器 + Dry Run Plan 第一版

理由:

10. 下一步建議

若採用本文件建議,下一步可以進入:

ALTER TABLE SQL 產生器與 Dry Run Plan 第一版實作

實作前仍需確認兩個決策:

  1. 第一版是否只允許新增缺少的 column / index,不允許修改或刪除既有項目。
  2. 第一版是否完全不連 MySQL,只做純字串與 Dry Run Plan。