Sql-Server

如何找到未通過 SSDT 發布的錯誤程式碼?

  • August 8, 2018

每次發布失敗時,假設它通過了預覽生成,錯誤行和執行的腳本範例在幫助我追踪錯誤的來源方面完全沒有用,因為行號是相對於最後一條GO語句的,並且執行的腳本沒有’ 並不總是出現在發布腳本中。

在這種情況下,它會因以下錯誤而失敗:

非常一般的錯誤

發布腳本中不存在執行的腳本:

它說它執行了這個程式碼

這是它在點兩下錯誤消息後在發布腳本中導航的位置:

根據發布的明顯錯誤線

通常我可以根據錯誤資訊進行追踪,但這一次我很茫然,因為我能想到的唯一相關的關鍵字太常見了,看起來毫無希望。

看起來日誌記錄是駭人聽聞的,並且錯誤有時會出現在部署後腳本之前(例如,由於發佈設置僅包含禁用 DDL 觸發器的選項,因此表觸發器在不完整的數據上執行)。

我曾嘗試在發布期間執行 SQL Server Profiler,但該工具忽略了更重要的調試資訊(並且被我的大型數據庫項目所淹沒)。升級以獲得擴展事件探查器的另一個原因可能是什麼?

SQL Server Profiler 跟踪結果無用

(我證實這句話不是罪魁禍首)

我會RAISERROR WITH NOWAIT在每個正在執行的塊開始時在部署後腳本中使用。這樣,您應該能夠看到部署在到達故障點之前已經走了多遠,並希望已將其縮小到特定的腳本。

我傾向於建構我的 SSDT 項目的方式是,我有一個部署後腳本,然後使用’s包含其他文件:r並將它們分隔開。GO然後,這給我留下了一個理想的地方來插入RAISERRORS以了解進度。或者,您應該將 粘貼RAISERROR在每個包含文件的頂部。

https://docs.microsoft.com/en-us/sql/t-sql/language-elements/raiserror-transact-sql?view=sql-server-2017連結中的關鍵點是:

RAISERROR 可用作 PRINT 的替代方法,將消息返回給呼叫應用程序。RAISERROR 支持類似於 C 標準庫中 printf 函式的功能的字元替換,而 Transact-SQL PRINT 語句不支持。PRINT 語句不受 TRY 塊的影響,而在 TRY 塊中執行嚴重性為 11 到 19 的 RAISERROR 會將控制權轉移到關聯的 CATCH 塊。指定 10 或更低的嚴重性以使用 RAISERROR 從 TRY 塊返回消息而不呼叫 CATCH 塊。

抱歉 - 這是假設錯誤在您的部署後腳本中。重新閱讀後,我意識到您的錯誤似乎在此之前。

引用自:https://dba.stackexchange.com/questions/214217