開發與資料處理

交接 SQL 前怎麼排版,才不會改掉查詢邏輯?

交接一大段 SELECT 查詢前,先保留原文、移除敏感值,再排版並核對佔位符、註解、字串與資料庫方言,避免把好讀誤當成語意正確。

撰文: 3sec 編輯部 4 分鐘閱讀 1677 字

交接 SQL 前,應把「讓查詢變好讀」和「證明查詢邏輯正確」分成兩件事。先保留未修改原文與參數說明,再用副本排版;最後仍由實際資料庫方言、權限與測試結果驗收。

先凍結原文、方言與參數,不要直接整理唯一副本

最安全的起點是留下一份不可改的原始查詢,並記錄它在哪種資料庫、哪個唯讀情境使用。排版副本即使看起來更清楚,也不能取代原文、工單紀錄或版本控制中的查詢。

例如客服要把一段很長的訂單查詢交給資料團隊,原文同時含有 :customer_id、$1、日期字串與一段說明篩選原因的註解。先把正式客戶編號、權杖、連線字串與內部主機名稱換成不會混淆型別的測試值,再另存「原文」和「排版工作副本」。不要只在聊天視窗留一份,也不要因為它以 SELECT 開頭,就假定子查詢、函式或權限一定沒有副作用。

交接說明至少要寫出資料庫產品與大致版本、佔位符由哪一層綁定、預期輸出欄位,以及查詢是否只能在測試或唯讀連線執行。MySQL 的反引號、SQL Server 的方括號、PostgreSQL 的 dollar-quoted 字串與各家函式並不完全相同;缺少方言資訊時,接手者很難判斷排版後的符號究竟是資料還是語法。

用格式化器看結構,但把輸出當成待審副本

SQL 格式化工具會在瀏覽器內整理貼上的文字,將常見的 SELECT、FROM、WHERE、JOIN、GROUP BY 與 ORDER BY 等關鍵字大寫並換行,也會在逗號後拆行。它提供複製結果,不會連線資料庫、讀取 .sql 檔、執行查詢或覆寫來源。

目前元件在整理外部空白前,會先保護單引號、雙引號、反引號、方括號識別字、-- 單行註解、/* */ 註解與可辨識的 dollar-quoted 區段。未關閉的引號、方括號、區塊註解或 dollar quote 會顯示錯誤,而不是猜測結尾。這些保護能降低常見文字被拆開的風險,卻不等於完整 SQL 解析器。

工具只針對一組常見關鍵字與簡單 SELECT 排版,不會辨識每種方言的程序語法、提示、運算子優先順序、巨集、模板標記或 ORM 參數規則,也不會驗證資料表和欄位是否存在。若查詢包含不熟悉的 vendor extension,先用短的去識別化片段確認顯示方式;無法判斷時保留原格式,把閱讀工作交給對應資料庫的官方格式化器或 IDE。

並排核對佔位符、註解和方言符號

排版後先核對不應改變的錨點,再看縮排是否有助閱讀。單純逐字比較會把所有空白與換行列成差異,因此不能只看「很多紅綠色」就判定查詢被改壞。

  • 逐一搜尋 :customer_id、$1、? 或 @AccountId 等佔位符,確認數量、名稱與順序沒有改變。
  • 核對字串中的空白、萬用字元、跳脫符號與大小寫;'A B' 和 'AB' 不是同一個值。
  • 確認每段註解仍緊鄰它所說明的條件,沒有因換行而被誤認為另一個子句的說明。
  • 檢查反引號、方括號、雙引號識別字與 dollar quote 是否成對,並確認資料庫真的採用該規則。
  • 比對 JOIN 條件、括號、逗號、排序方向與 LIMIT,不要只掃大寫關鍵字。

需要定位時,可以把原文和結果貼進文字差異比對的字元模式,但要把空白造成的差異和實際 token 變更分開看。文字差異工具不理解 SQL 語意,也不能證明兩段查詢等價;它只協助找到值得人工閱讀的位置。

回到資料庫的安全環境做語法與結果驗收

真正的完成條件是目標資料庫接受已核准的交接版本,而且結果符合預期。先使用相同方言的語法檢查、IDE 或資料庫提供的解釋計畫功能,再於核准的測試資料與唯讀權限下執行;不要把來路不明的查詢直接送進正式環境。

驗收時使用交接文件列出的測試參數,核對欄位名稱、資料型別、筆數範圍、排序與已知樣本。若排版前後都能執行,也仍要比較關鍵結果;同樣的成功訊息不代表兩次使用了相同參數、資料快照或連線設定。

最後只交付已核對的版本,並附上原文位置、方言與版本、參數表、驗證日期及尚未確認的限制。若接手者還要改條件,應從版本控制建立新的變更,而不是在排版輸出上悄悄續改。這樣排版是閱讀輔助,不會被誤當成查詢正確性的證書。

常見問題

SQL 格式化工具會修改資料庫嗎?

不會。它只在目前瀏覽器分頁處理貼上的文字並提供複製結果,沒有資料庫連線、查詢執行或檔案覆寫功能。

排版成功是否代表查詢語意完全沒變?

不代表。工具會改動關鍵字大小寫、空白與換行,而且不是完整方言解析器;重要查詢仍要核對 token、參數,並由目標資料庫驗證。

註解和字串會被拆開嗎?

目前元件會先保護常見引號字串、識別字和兩類註解,未關閉區段則報錯。不過特殊方言、模板或不常見跳脫規則仍可能超出支援範圍,必須用原文人工確認。

可以貼上正式環境的完整查詢嗎?

不應直接貼入含客戶資料、權杖、連線字串或內部位址的內容。先建立保留型別與結構的去識別化副本;無法安全移除秘密時,就使用組織核准的本機工具。

文字差異完全相同就證明兩段 SQL 等價嗎?

逐字完全相同只能證明貼上的字元相同;經過排版後通常連這一點也不會成立。SQL 等價還涉及方言、參數、資料與執行環境,必須由對應資料庫的安全測試確認。