作者:唐瑤瑤 / 臺灣大學計算機及資訊網路中心程式設計組程式設計師
在資料庫開發中,可靠的錯誤處理與日誌記錄是確保系統穩定性與可維護性的關鍵。本文將以Microsoft SQL為例,探討如何在 SQL Stored Procedure中設計錯誤處理機制,並實現有效的日誌記錄,幫助開發者快速定位問題。
1.開發Stored Procedure時偵錯之困難
在開發 Stored Procedure 時,相較於 Web 應用程式的開發,偵錯更加困難,主要原因包括:
- 缺乏即時偵錯工具:不像傳統應用程式開發可以使用 IDE 進行step by step偵錯與變數監視,SQL Stored Procedure 通常需要透過 PRINT 或 SELECT 來輸出測試資訊。
- 錯誤訊息不夠明確:當發生錯誤時,SQL Server 只會傳回錯誤代碼與簡短的錯誤描述,開發人員需自行分析錯誤發生的確切位置。
- 交易(Transaction)影響偵錯:在複雜交易(如巢狀式交易)中,部分錯誤可能導致交易鎖住,使得系統無法正確Rollback並影響後續操作。
- 存取權限問題:在大型企業環境中,不同開發人員對資料庫的存取權限可能不同,導致部分錯誤無法輕易重現。
- 因此,良好的錯誤處理與日誌記錄不僅能幫助迅速定位錯誤,還能提升程式碼的可維護性與可讀性。
2.使用TRY...CATCH實現錯誤捕捉
SQL Server 提供了 TRY...CATCH 結構來捕捉執行時的錯誤。這是一個非常有用的工具,可用於交易處理和錯誤記錄。
TRY...CATCH基本語法

關鍵函數介紹
- ERROR_MESSAGE():傳回錯誤訊息。
- ERROR_PROCEDURE():傳回發生錯誤的 Stored Procedure 名稱。
- ERROR_LINE():傳回發生錯誤的行號。
- ERROR_NUMBER():在 CATCH 區塊中呼叫時,傳回造成執行錯誤的錯誤號碼。
- ERROR_SEVERITY():傳回錯誤的嚴重性值。
- ERROR_STATE():傳回錯誤的狀態碼。
- THROW:重新拋出錯誤,以便進一步處理。
3.設計健全的日誌記錄系統
日誌記錄是快速定位問題的重要工具。在設計日誌系統時,需要考慮以下幾點:
日誌資料表結構,建立專門的日誌資料表來儲存錯誤資訊:

統一日誌寫入邏輯,使用單一的Stored Procedure實現日誌記錄,以便重複使用:
更好的錯誤通知機制(結合 SQL Server Database Mail),除了寫入日誌表,還可以使用SQL Server Database Mail通知開發人員即時處理錯誤:

自動化日誌清理,還可以定期清理日誌,只保留特定天數內的日誌:

4.完整實例:結合錯誤處理、日誌記錄與郵件通知


測試
我們將TRANSACTION內的程式碼修改如下,可以立即測試並得到錯誤日誌。


結語
藉由TRY...CATCH架構實現可靠的錯誤處理,並設計健全的日誌記錄與郵件通知機制,可以有效提升SQL Stored Procedure的穩定性與可維護性。希望本文的範例與說明能幫助各位在實際專案中應用這些技術,讓資料庫程式設計更加穩健。
參考資料