一個寫了 8 年、至今仍持續更新的資料庫工具:JasonQuery,現在正式開源…
2022 年,我曾經第一次在 IT 邦幫忙介紹 JasonQuery,當時我原本期望可以在 2022年把它開源:
【原創】自製資料庫管理工具 - JasonQuery
結果,真正走到「可以放心公開」這一步,比我當時想像得久得多。
而且,這4年來我一直在做一件事
如何讓不認識我的人,可以安心的下載並使用 JasonQuery?
不只是「程式能不能執行」,還包括資料安全、舊版本相容、Transaction、Recovery、更新完整性、第三方授權,以及開源之後別人能不能理解這個專案到底在做什麼。
現在,JasonQuery 終於正式開源了。

JasonQuery GitHub 倉庫
JasonQuery 官網
JasonQuery Release Notes
我不喜歡 SQL Tool 在背後執行了一些 SQL,等出錯時,使用者卻不知道工具到底做了什麼。
所以 JasonQuery 的設計原則之一就是:
SQL Tool 不應該偷偷做事。
這不是要把 SQL History 做成企業級 Audit Log,而是希望:
當工具和資料庫之間發生了什麼事情時,使用者有辦法追查。

因此 JasonQuery 提供 Pending Transaction Reminder。
當 Transaction 持續未完成時,主畫面會顯示其狀態,並定期提醒使用者:
這個 Transaction 還沒有 Commit 或 Rollback。
目的不是替使用者自動決定,而是避免使用者工作到一半,把它忘掉了。
對 locking query 也是一樣。
例如在支援 SELECT ... FOR UPDATE 的資料庫中,雖然 SQL 是以 SELECT 開頭,但它並不是一般單純的唯讀查詢;它會涉及 Transaction 與 Locking。
JasonQuery 會把這類需要注意 Transaction 狀態的操作納入提醒機制,而不是因為它叫做 SELECT 就忽略它。
Commit 或 Rollback,由使用者決定;JasonQuery 負責不要讓這個決定被忘記。

JasonQuery 自己也需要保存設定、連線資訊及其他的設定資料。
到了 v0.96,我重新整理了整個 JasonQuery.db 的 security 與 storage architecture。
目前新建立的 JasonQuery.db 採用 SQLCipher 4-compatible storage format,並由獨立產生的 logical database key 保護。
JasonQuery 提供兩種保護方式:
但我後來發現,只做到「加密」還不夠。
如果 Windows 重灌了,或者原本的 Windows User Profile / DPAPI 環境損毀,資料加密得再安全,如果連合法使用者自己都永遠救不回來,也是一個問題。
所以 v0.96 又加入了 Recovery Key。
在 Windows Protected 模式下,使用者可以預先建立 Recovery Key;如果未來原本的 Windows 保護環境已經不存在,可以透過 Recovery Key 驗證 JasonQuery.db 的配對關係,重新建立目前 Windows 使用者的保護。
錯誤、不匹配或遭修改的 Recovery Key 會被拒絕,而不應該因此錯誤修改既有的 JasonQuery.db。
另外,舊版 Storage V1 → Storage V2 的升級也不是單純「解密後再存一份」。
對我來說:
資料安全不只是「能不能加密」,還包括升級失敗時能不能停下來,以及災難發生後,合法使用者能不能把資料救回來。
操作資料庫時,一個很常見、也很危險的問題:
我現在連的是 Production,還是 Test?
JasonQuery 可以讓不同連線使用不同的顏色與 Icon。
例如你可以自己約定:
環境的顏色意義由使用者定義,JasonQuery 負責讓這個差異在畫面上足夠明顯。
這是一個很小的功能,但我自己認為,資料庫工具裡很多真正有價值的設計,往往就是這種「少犯一次錯就值得」的功能。

我不希望只介紹 JasonQuery 可以做什麼,而不說它不能做什麼。
JasonQuery 目前只支援 Windows x64。這是一個有意識的取捨。
JasonQuery 是一人維護的專案。與其把有限的時間分散到 Windows、Linux、macOS,再讓每個平台都只能做到一部分功能,我選擇先把 Windows 版本做好。
結論:目前沒有跨平台計畫。
JasonQuery 是一個從 2018 年一路演進至今的 WinForms application,目前使用 .NET Framework 4.8、C# 8.0、x64。
我沒有因為新的 UI framework 出現,就把整套程式重新改寫一次。
對 JasonQuery 而言,目前更重要的是既有功能、資料相容性、Transaction、Recovery 與 database-specific behavior 能不能持續可靠運作,而不是為了技術更新本身進行大型 rewrite。
JasonQuery-owned source 已經以 MIT License 開源,但這不代表所有 dependency 都能一起放進 repository。
JasonQuery 使用了一些第三方元件,例如:
JasonQuery 當然不是一個「所有功能都已經做完」的專案。
八年來它一直在演進,到現在也還在持續更新。
只是和 2022 年最大的差別是:
當時,我只是希望有一天可以把它放到 GitHub。
現在,我希望做到的是:
讓一個不認識我的人,也能知道它能做什麼、不能做什麼;可以放心下載,也可以看得懂我為什麼這樣設計。
如果你平常使用 Oracle、PostgreSQL、SQL Server 或 MySQL,歡迎實際下載試試看。
遇到問題,也歡迎到 GitHub 開 Issue。
JasonQuery can do more than you think.