跳到主要內容區塊

計資中心電子報C&INC E-paper

技術論壇

在SQL Stored Procedure中實現可靠的錯誤處理與日誌記錄
  • 卷期:v0077
  • 出版日期:2025-06-20

作者:唐瑤瑤 / 臺灣大學計算機及資訊網路中心程式設計組程式設計師


 

在資料庫開發中,可靠的錯誤處理與日誌記錄是確保系統穩定性與可維護性的關鍵。本文將以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基本語法

20260620_007706_01

 

關鍵函數介紹

  • ERROR_MESSAGE():傳回錯誤訊息。
  • ERROR_PROCEDURE():傳回發生錯誤的 Stored Procedure 名稱。
  • ERROR_LINE():傳回發生錯誤的行號。
  • ERROR_NUMBER():在 CATCH 區塊中呼叫時,傳回造成執行錯誤的錯誤號碼。
  • ERROR_SEVERITY():傳回錯誤的嚴重性值。
  • ERROR_STATE():傳回錯誤的狀態碼。
  • THROW:重新拋出錯誤,以便進一步處理。

 

3.設計健全的日誌記錄系統

日誌記錄是快速定位問題的重要工具。在設計日誌系統時,需要考慮以下幾點:

 

日誌資料表結構,建立專門的日誌資料表來儲存錯誤資訊:

20260620_007706_02

 

統一日誌寫入邏輯,使用單一的Stored Procedure實現日誌記錄,以便重複使用:20260620_007706_03

更好的錯誤通知機制(結合 SQL Server Database Mail除了寫入日誌表,還可以使用SQL Server Database Mail通知開發人員即時處理錯誤:


20260620_007706_04

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

20260620_007706_05

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

20260620_007706_06

20260620_007706_07

測試

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

20260620_007706_08

 

 

 

20260620_007706_09


結語

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

 

參考資料