Skip to content

修正批次傳輸與桌面操作安全,新增受限 SQL Server 降版搬移 - #42

Merged
NickYCLin merged 6 commits into
masterfrom
fix/safe-transfer-operations
Oct 14, 2026
Merged

NickYCLin merged 6 commits into
masterfrom
fix/safe-transfer-operations

Conversation

@NickYCLin

Copy link
Copy Markdown
Collaborator

修改與原因

  • SQL Server INSERT 同時依參數及 VALUES 列數切批,全批交易避免中途失敗留下資料。
  • 桌面 session 在準備失敗/取消時釋放,操作 gate 拒絕 SQL 重入並阻擋取消結果發布。
  • 一般傳輸的列數不符明確失敗;不確定批次與無主鍵續傳禁止自動重試,保留目標。
  • 原生 RESTORE 先檢查備份版本;另提供新版引擎至舊版引擎的受限邏輯搬移。
  • 降版只接受明確選版本、預檢、輸入名稱確認後的新空目標;dbo heap 白名單之外一律阻擋。全交易分批、內容雜湊與結構驗證,不自動覆蓋。

實際驗證

  • Linux 跨平台 Release build 成功;離線 smoke 29/29。
  • 隔離 SQLite:699/700/701/1000/1001 列邊界、第二批失敗回滾與重試不重複。
  • 實際 DataTransferService 隔離 mock:列數不符、舊 Done 狀態、部分寫入、重試阻擋與無主鍵保留目標。
  • 搬移 mock:型別/版本/確認/空目標/定序與 feature guard、內容/結構不符、途中取消、Begin/write/commit/rollback 失敗及提交回覆遺失。
  • 隔離 HOME 的 Linux UI:SQLite 連線、Ctrl+Enter、結果網格通過。
  • Mono 編譯新增搬移表單及實際 SQL adapter(周邊 endpoint 使用 stub);不等於 Windows 完整編譯。

限制

  • 請以 Windows CI 驗證完整 WinForms build 與基本 smoke,未在本機假報 Windows 通過。
  • SQL Server 2016–2025 目前只有受限邏輯與 mock,沒有真引擎降版矩陣;UI 與文件明示預覽版。
  • identity/constraints/indexes/triggers/procs/schema 相依與進階 features 均 fail closed,詳見 docs/MSSQL_COMPATIBILITY_MIGRATION.md。
  • 未連使用者真實 DB、未讀秘密、未部署或更動權限。

原本 1,000 列三欄會產生 3,000 個參數,超過 SQL Server 上限。改為同時依參數數量與 VALUES 列數切批,整次新增使用同一交易,避免中途失敗留下前批資料而讓重試重複。

離線 SQLite 覆蓋 699、700、701、1,000、1,001 列邊界、第二批失敗回滾及重試;跨平台 smoke 已通過。Windows 整體編譯與 smoke 將由 PR CI 驗證。
建立 session 後,連線測試或取得資料庫失敗會留下連線資源與 SSH tunnel。新增暫時所有權 lease,成功且未取消才交給主視窗,其餘路徑一律釋放;密碼對話框返回後也再次確認沒有正在執行的操作。

mock 覆蓋準備失敗、取消與成功移交,確認 Dispose 次數。跨平台建置與 smoke 通過,隔離 HOME 的 SQLite UI 已確認可啟動。
原本 RunOperationAsync 取消舊操作後立即重入,快捷鍵也能繞過 busy 狀態。改用共用互斥 gate,直到 provider 真正返回才釋放;SQL 與物件清單在發布前再次檢查取消,避免舊結果覆蓋畫面。

延遲完成的 mock 驗證重複操作被拒、取消期間不能重入、取消結果不發布,以及完成後可接受下一次操作。
列數不符不能仍標為 Done。新增驗證失敗狀態,只有明確驗證通過才算完成;每批寫入前保存不可重試 checkpoint,成功記錄進度後解除。沒有主鍵的續傳不再刪除既有目標重來,保留資料供人工核對。

回歸測試涵蓋額外目標列、驗證失敗重跑不寫入與不確定 checkpoint。隔離 mock 執行實際 DataTransferService,確認部分寫入錯誤、舊 Done 狀態與無主鍵續傳不會誤報完成或重複寫入。
新版 .bak 不能還原到舊引擎,compatibility level 也不會改變備份格式。還原先讀 HEADERONLY 與目標 ProductVersion,版本未知、來源較新、複數備份組或非完整備份都在改動資料庫前拒絕,不再等到 RESTORE 才失敗。

離線測試覆蓋同版本、降版拒絕、未知版本、複數備份與非完整備份。Microsoft RESTORE Compatibility support 已核對;實際引擎還原測試未執行。
新增來源與目標引擎識別、明確版本選擇、結構與列數預覽,以及輸入目標名稱後才執行的確認流程。交易內再次核對預檢指紋,只搬移 dbo 一般 heap 與白名單型別,identity、constraints、indexes、triggers、procs、schema 相依、定序差異及進階功能一律阻擋,不自動覆蓋或略過。

資料以 500 列分批寫入單一交易,逐欄型別、NULL、內容雜湊與結構全部相符才提交。失敗或取消回滾;提交回覆遺失、回滾失敗或清理結果不確定時禁止重試,報告保留階段及例外類型而不附資料或連線秘密。

離線跨平台 smoke 29/29,隔離 SQLite UI 連線、快捷鍵 SQL 與結果網格通過;實際 DataTransferService mock 回歸、搬移 mock 與 Mono 表單相依編譯也通過。2016–2025 尚未建立真 SQL Server 降版矩陣,文件與 UI 明確標示預覽版與限制,Windows 完整 build/smoke 交由 PR CI 驗證。
@NickYCLin

Copy link
Copy Markdown
Collaborator Author

完成本地人工程式碼複核:確認整次 SQL Server 批次新增共用交易、session 未移交路徑釋放、操作 gate 在 provider 返回前不釋放,以及驗證失敗/不確定 checkpoint 禁止自動重試。降版搬移僅在明確確認與交易內重新預檢後寫入空目標,未支援物件不會略過;提交回覆遺失會回報不確定,不宣稱已回滾。Windows CI 已通過 Release 建置、240 項 smoke、實際安裝/更新/重新啟動驗收(run 38502063099);其餘平台 CI 尚在執行,全部通過後才合併。沒有真 SQL Server 版本矩陣與 Windows 搬移表單人工操作證據;文件與 UI 保留預覽版標示。此複核不是外部 reviewer 的核准。

@NickYCLin
NickYCLin merged commit fa07e2e into master Oct 14, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant