如何找到未通過 SSDT 發布的錯誤程式碼?
每次發布失敗時,假設它通過了預覽生成,錯誤行和執行的腳本範例在幫助我追踪錯誤的來源方面完全沒有用,因為行號是相對於最後一條
GO
語句的,並且執行的腳本沒有’ 並不總是出現在發布腳本中。在這種情況下,它會因以下錯誤而失敗:
發布腳本中不存在執行的腳本:
這是它在點兩下錯誤消息後在發布腳本中導航的位置:
通常我可以根據錯誤資訊進行追踪,但這一次我很茫然,因為我能想到的唯一相關的關鍵字太常見了,看起來毫無希望。
看起來日誌記錄是駭人聽聞的,並且錯誤有時會出現在部署後腳本之前(例如,由於發佈設置僅包含禁用 DDL 觸發器的選項,因此表觸發器在不完整的數據上執行)。
我曾嘗試在發布期間執行 SQL Server Profiler,但該工具忽略了更重要的調試資訊(並且被我的大型數據庫項目所淹沒)。升級以獲得擴展事件探查器的另一個原因可能是什麼?
(我證實這句話不是罪魁禍首)
我會
RAISERROR WITH NOWAIT
在每個正在執行的塊開始時在部署後腳本中使用。這樣,您應該能夠看到部署在到達故障點之前已經走了多遠,並希望已將其縮小到特定的腳本。我傾向於建構我的 SSDT 項目的方式是,我有一個部署後腳本,然後使用’s包含其他文件
:r
並將它們分隔開。GO
然後,這給我留下了一個理想的地方來插入RAISERRORS
以了解進度。或者,您應該將 粘貼RAISERROR
在每個包含文件的頂部。RAISERROR 可用作 PRINT 的替代方法,將消息返回給呼叫應用程序。RAISERROR 支持類似於 C 標準庫中 printf 函式的功能的字元替換,而 Transact-SQL PRINT 語句不支持。PRINT 語句不受 TRY 塊的影響,而在 TRY 塊中執行嚴重性為 11 到 19 的 RAISERROR 會將控制權轉移到關聯的 CATCH 塊。指定 10 或更低的嚴重性以使用 RAISERROR 從 TRY 塊返回消息而不呼叫 CATCH 塊。
抱歉 - 這是假設錯誤在您的部署後腳本中。重新閱讀後,我意識到您的錯誤似乎在此之前。