Skip to content

Commit 7394f1e

Browse files
NickYCLinclaude
andcommitted
feat(windows): 資料比較與受控同步
結構比較視窗新增「比較資料…」,以 Primary Key 逐列比對同類型資料庫的同名資料表, 可預覽 SQL 並在目標以單一交易同步:依外鍵相依排序、交易內重讀目標原值防並行修改、 刪除預設不含且需輸入資料庫名稱、計算欄位不寫入、identity 保留來源值。 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CM3dbt782c4iCA1TJyn2p8
1 parent 3e5a1f5 commit 7394f1e

11 files changed

Lines changed: 1328 additions & 2 deletions

‎CHANGELOG.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
- **Linux/macOS TLS 憑證檔案**:跨平台連線設定頁新增 CA 憑證(SQL Server 為伺服器憑證)、客戶端憑證與客戶端私鑰路徑,分別對應 MySqlConnector `SslCa`/`SslCert`/`SslKey`、Npgsql `RootCertificate`/`SslCertificate`/`SslKey` 與 SqlClient `ServerCertificate`,URI 也可用 `sslca`、`sslrootcert`、`sslcert`、`sslkey`、`servercertificate` 一併帶入。所有規則 fail closed:CA 憑證只接受 VerifyCA/VerifyFull(SQL Server 為 Mandatory/Strict),客戶端憑證與私鑰須成對、模式至少 Required,SQL Server 與 SQLite 不接受客戶端憑證;路徑必須是絕對路徑且不含控制字元,儲存、測試與連線前會確認檔案存在、不是目錄,且私鑰在 Unix 上不可被其他使用者讀取。切換資料庫類型時不支援的客戶端憑證欄位會清空,`connections.json` 以明確欄位保存路徑、仍不保存密碼或私鑰內容。實機矩陣會以 MySQL 8 容器自動產生的 CA 驗證 VerifyCA 通過、VerifyFull(主機名稱不符)與錯誤 CA 失敗,並以臨時 CA 簽發 SAN 127.0.0.1 憑證的 PostgreSQL 16 容器驗證 VerifyFull 成功、Disabled 不加密與錯誤 CA 失敗;SQL Server 2022 TLS 容器則驗證 Mandatory 搭配伺服器憑證精確比對成功、未固定或錯誤憑證失敗。
1414
- **Linux/macOS 執行計畫**:跨平台查詢工具列新增「執行計畫」,依游標所在 statement 或反白範圍取得 MySQL/MariaDB `EXPLAIN FORMAT=JSON`、PostgreSQL `EXPLAIN (FORMAT JSON, ANALYZE FALSE)`、SQL Server `SHOWPLAN_ALL` 與 SQLite `EXPLAIN QUERY PLAN` 的唯讀計畫,以獨立視窗呈現樹狀節點(相對成本 ≥ 50% 標紅、≥ 20% 標橘)、節點屬性、文字計畫與原始 JSON/表格,可一鍵複製文字計畫。一次只接受一個 SELECT/WITH/INSERT/UPDATE/DELETE/REPLACE,拒絕 DDL 與多 statement,分隔符判斷不受字串、識別字與註解內分號影響;不使用 ANALYZE、SQL Server 在同一連線開關 SHOWPLAN,失敗也一定關閉,因此解釋 INSERT/DELETE 不會修改資料。SQLite 對簡單 INSERT 回傳零列時以「無計畫步驟」呈現。smoke test 覆蓋四種 provider 的解析、深度上限、循環 parent 與拒絕案例,SQLite 與 Docker 實機矩陣都驗證解釋 INSERT/DELETE 後列數不變、被拒絕的請求不執行任何 statement,且 SQL Server 之後的查詢仍回傳資料。
1515
- **Linux/macOS 資料比較與同步**:結構比較視窗新增「比較資料…」,可逐表以 Primary Key 比對兩個同類型資料庫中同名資料表的資料列,列出只在來源、只在目標、內容不同與一致的列數(每表上限 50,000 列,超過或 Primary Key 不同則略過並說明),並可預覽 SQL。同步只修改目標:所有資料表的新增、修改(只改不同的欄位)、刪除在單一交易中執行,依外鍵相依排序(先刪子表、再依序修改與新增父子表);每列都以比對當下讀到的目標原值作為條件,比對後目標若被他人修改即整批回滾。刪除只在目標的資料列預設不勾,勾選時須輸入目標資料庫名稱;寫入沿用資料編輯器的型別轉換與參數化路徑,identity/auto_increment 主鍵保留來源值(SQL Server 使用 IDENTITY_INSERT、PostgreSQL 使用 OVERRIDING SYSTEM VALUE 並重設序列),計算欄位與不支援的型別不比較也不寫入,完成後自動重新比較。smoke test 與 Docker 實機矩陣在 SQLite、MySQL 8、MariaDB 11.4、PostgreSQL 16、SQL Server 2022 驗證:比對結果、相依排序、並行修改整批回滾、同步後重新比較完全一致,以及同步後以預設值新增資料列不撞主鍵。
16+
- **資料比較與同步(Windows)**:結構比較視窗新增「比較資料…」,可勾選兩個同類型資料庫(MySQL/MariaDB、PostgreSQL、SQL Server、SQLite)共有的資料表,以 Primary Key 逐列比對,列出新增、修改、刪除與一致的列數;每表上限 50,000 列,無主鍵、主鍵不同或主鍵值重複的資料表會略過並說明。可預覽 SQL(只在目標的資料列以單行註解列出),同步只修改目標:所有資料表在單一交易中依外鍵相依排序執行(先刪子表、再修改與新增),修改只寫入不同的欄位,每列寫入前在交易內重讀並比對比較當下的目標值,被他人修改即整批回滾。刪除預設不包含,勾選時須輸入目標資料庫名稱;計算欄位不比較也不寫入,SQL Server identity 使用 IDENTITY_INSERT、PostgreSQL identity 使用 OVERRIDING SYSTEM VALUE 並重設序列;完成後自動重新比較。smoke test 以兩個 SQLite 資料庫驗證比較、相依排序、不含與含刪除的同步、並行修改回滾及惡意主鍵值無法逃出預覽註解。
1617
- **Linux/macOS 在目標執行同步 SQL**:同步 SQL 預覽新增「在目標執行」分頁,逐句列出語句與勾選框:非破壞性語句預設勾選、刪除類語句以紅字列出且預設不勾,勾選任何破壞性語句時必須輸入目標資料庫名稱才能執行。語句只送到比較時實際使用的目標連線,不經過連著來源的編輯器;PostgreSQL、SQL Server、SQLite 以單一交易執行、任一句失敗整批回滾,MySQL/MariaDB 的 DDL 會自動提交,遇錯即停並逐句標示已生效/失敗/未執行。每句顯示成功、失敗原因或回滾狀態,執行中無法關閉視窗,完成後自動重新比較。Core 新增 `ExecuteBatchAsync`;實機矩陣在五種資料庫以它套用同步語句,並驗證失敗時的回滾與部分生效回報。
1718
- **結構比較:同步 SQL 預覽(Windows)**:結構差異頁新增「同步 SQL 預覽」,MySQL/MariaDB、PostgreSQL、SQL Server、SQLite 同類型資料庫之間可產生讓目標跟上來源的腳本:建立缺少的資料表(含主鍵)、新增欄位、PostgreSQL/SQL Server 的型別與 NULL 變更,以及補上缺少的外鍵(排在建表之後)。刪除只在目標的資料表、欄位、外鍵一律以註解輸出;MySQL 的 MODIFY 需要完整欄位定義,因快照不含預設值、AUTO_INCREMENT、字元集與註解,只列為附建議語法的手動項目;主鍵變更、SQLite 的欄位修改與外鍵也列為手動。Windows 版快照不含預設值、索引與外鍵規則,腳本開頭會註明。預覽視窗可複製或另存 .sql,也可在「在目標執行」分頁逐句勾選後於目標連線執行:刪除類語句預設不勾,勾選時必須輸入目標資料庫名稱;PostgreSQL/SQL Server/SQLite 以單一交易執行、失敗整批回滾,MySQL/MariaDB 遇錯即停並標示已生效語句;MySQL 沿用查詢視窗的 USE 慣例、SQL Server 暫時切換資料庫後切回,PostgreSQL 連線不在目標資料庫時拒絕執行;完成後自動重新比較。不會送進查詢視窗;跨類型比較與 Oracle 不產生腳本。smoke test 覆蓋四種 provider 的語句、註解注入與拒絕案例,產生的腳本也實際套用到 MySQL 8、PostgreSQL 16、SQL Server 2022 與 SQLite 驗證可執行。
1819
- **Linux/macOS 同步 SQL 預覽**:結構比較視窗新增「同步 SQL 預覽…」,同類型資料庫之間可產生讓目標結構跟上來源的指令碼:建立資料表(MySQL 取 SHOW CREATE TABLE、SQLite 取原始建立語法、PostgreSQL/SQL Server 依欄位與主鍵組出)、新增與修改欄位、建立或重建索引(MySQL/MariaDB 保留前綴長度與降冪,函式索引列為手動)、新增或重建外鍵、重建檢視表,依建表→欄位→索引→外鍵→檢視表排序,外鍵延後建立避免參照表尚未存在。會刪除資料或物件的變更(只在目標的資料表、欄位、索引、外鍵、檢視表)一律以註解輸出、預設不執行;型別收窄、SQL Server 具名預設值、主鍵變更、identity/generated 差異、SQLite 無法 ALTER 的欄位與外鍵等列在「需手動處理」。視窗提供複製與另存 .sql,不送進編輯器,因為編輯器連的是來源;跨類型比較不產生腳本。所有註解文字都壓成單行,惡意物件名稱無法逃出註解。smoke test 與 Docker 實機矩陣在 SQLite、MySQL 8、MariaDB 11.4、PostgreSQL 16、SQL Server 2022 上執行「產生→套用→重新比較」,確認只剩被註解的破壞性差異。

‎docs/FEATURE_NOTES.md‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,9 +148,10 @@
148148
- 操作:從 Models 下的 Schema Comparison 或資料庫右鍵「比較資料庫結構」選擇另一個已開啟的資料庫;比較結果以可停靠分頁呈現,可重新比較、交換來源/目標並匯出 HTML。
149149
- 比較範圍:沿用 provider-neutral schema 快照,比對資料表、欄位、資料型別、可空值、Primary Key 與外鍵;外鍵以來源欄位及參照目標的語意比對,不因兩邊 constraint 名稱不同而誤報。
150150
- 跨 provider:常見等價型別別名會先正規化,例如 `INT`/`INTEGER`、`BOOLEAN`/`BOOL`,但長度或精度不同仍會列為差異;單邊 metadata 讀取警告會保留在報告內,避免把不完整資料誤當成完全一致。
151-
- 安全:目前只讀取 metadata、顯示及匯出報告,可產生同步 SQL 預覽但從不自動執行;逐項勾選與受控執行仍在後續排程。
151+
- 安全:比較本身只讀取 metadata 與資料列;同步 SQL 與資料同步只在使用者勾選並確認後送到比較時使用的目標連線,破壞性項目預設不勾且需輸入資料庫名稱。
152152
- 驗證:smoke test 覆蓋來源/目標獨有資料表與欄位、型別、NULL、PK、FK、metadata 警告、固定排序、HTML 編碼,以及唯讀 dockable workspace 行為。
153153
- 同步 SQL 預覽:結構差異頁的「同步 SQL 預覽」可為同類型資料庫(MySQL/MariaDB、PostgreSQL、SQL Server、SQLite)產生讓目標跟上來源的腳本,涵蓋建表、加欄位、PostgreSQL/SQL Server 型別與 NULL 變更、補外鍵;刪除類變更一律註解,MySQL MODIFY 與主鍵、SQLite 限制列為手動項目。可複製、另存,或在「在目標執行」分頁勾選後於目標執行(刪除類預設不勾且需輸入資料庫名稱;交易式 provider 失敗整批回滾、MySQL 遇錯即停並標示已生效),完成後自動重比;腳本實際在 MySQL 8、PostgreSQL 16、SQL Server 2022、SQLite 套用驗證。
154+
- 資料比較與同步:結構比較視窗的「比較資料…」以 Primary Key 逐列比對同類型資料庫的同名資料表(每表上限 50,000 列、無主鍵或主鍵重複則略過),可預覽 SQL 並在目標以單一交易同步;依外鍵相依排序(先刪子表),每列寫入前在交易內重讀目標原值,比對後被修改即整批回滾;刪除只在目標的資料列預設不同步,勾選時需輸入資料庫名稱;計算欄位不寫入,SQL Server identity 以 IDENTITY_INSERT、PostgreSQL 以 OVERRIDING SYSTEM VALUE 保留來源值並重設序列。smoke test 以兩個 SQLite 資料庫驗證比較、不含刪除與含刪除的同步、並行修改回滾與註解注入。
154155

155156
- **Navicat 對齊:物件 URI 分享與直接定位 ✅ 已完成**
156157
- 操作:database 與 Table、View、Function、User、Event、Model、BI、內建工具、Report 可從左側樹或物件清單右鍵複製 `mysqlpunk://object` URI;接收方開啟 URI 後會清除暫時的連線搜尋條件、找到目前設定檔的同名連線並定位物件。

‎docs/ROADMAP.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
| Procedure/Function 偵錯器(中斷點、逐步、變數、呼叫堆疊) | 📋 | 依 provider 能力分階段實作,優先 PostgreSQL/SQL Server。 |
5151
| AI 助理/詢問 AI | 🟡 | 核心聊天與 schema 上下文已完成,進階動作見上表。 |
5252
| 資料傳輸/遷移(跨 DBMS) | 🟡 | 已有 Table/View 跨 provider 複製;待補整庫精靈、mapping、續傳與驗證報告。 |
53-
| 資料同步 | 🟡 | Linux/macOS 預覽版已可逐列比較同類型資料庫的同名資料表、預覽 SQL,並在目標以單一交易受控同步(相依排序、並行衝突回滾、刪除需確認);待補 Windows 版、大表串流比較與跨類型資料庫。 |
53+
| 資料同步 | 🟡 | Windows 與 Linux/macOS 皆可逐列比較同類型資料庫(MySQL/MariaDB、PostgreSQL、SQL Server、SQLite)的同名資料表、預覽 SQL,並在目標以單一交易受控同步(相依排序、並行衝突回滾、刪除需確認);待補大表串流比較與跨類型資料庫。 |
5454
| 結構同步 | 🟡 | 兩庫唯讀結構差異報告已完成,可跨 provider 比對 Table、Column、PK 與 FK 並匯出 HTML;Linux/macOS 預覽版另含索引與 FK 規則比對,並可為同類型資料庫產生同步 DDL 預覽(破壞性變更預設註解);Windows 版也能依欄位/主鍵/外鍵快照產生同步 SQL 預覽;Windows 與 Linux/macOS 都可逐項勾選並在目標受控執行(交易回滾、破壞性變更輸入名稱確認、完成後自動重比)。 |
5555
| 模型 | 🟡 | 已有五種 provider 共用的唯讀 ER 圖與兩庫結構差異報告;拖曳編排、多模型與雙向同步仍在後續排程。 |
5656
| BI | 📋 | 見 Navicat 17 BI 路線。 |

0 commit comments

Comments
 (0)