2015-11-06 66 views
0

我一直在使用SSDT和VS2013,到目前爲止,已經發現當存儲過程引用不存在的列時,構建失敗。SSDT發佈時出錯但未生成

今天我已經成功構建了一個項目,但發現發佈失敗。錯誤是標準的「權限有一個未解決的引用對象[表]。[列]」。我知道這是由於存儲過程尋找不再存在的列。

我的問題是爲什麼這個構建首先取得成功,因爲這肯定是失敗應該發生的地方。是否有一個配置選項可以在構建級別控制這種行爲?

回答

2

這裏有兩種情況的行爲不同。

場景1:引用數據庫項目中定義的表中不存在的列的存儲過程將產生錯誤並阻止構建成功。

場景2:引用未在數據庫項目中定義的表的存儲過程將產生警告,並且不會阻止構建成功。

情景2更有趣,因爲當您嘗試發佈項目時,發佈可能成功或失敗,具體取決於目標數據庫中的內容以及您如何配置部署設置。例如,假設:

  • 你的存儲過程包含dbo.SomeTable.Column1
  • 參考數據庫項目不包含dbo.SomeTable

定義在這種情況下,如果目標數據庫不包含dbo.SomeTable,則部署將成功,因爲SQL Server允許過程引用不存在的表(稱爲延遲名稱解析功能)。

但假設目標數據庫確實包含dbo.SomeTable。如果目標數據庫上的dbo.SomeTable實際上有一個名爲Column1的列,則部署將會成功。但是,如果目標數據庫上的dbo.SomeTable沒有名爲Column1的列,則部署將失敗。

您不清楚您遇到過哪種情況。如果它更像方案1,其中對數據庫項目中定義的表有無效的引用,但由於某些原因,SSDT不會產生錯誤,那麼這就是一個錯誤,並且記錄連接問題會很好在https://connect.microsoft.com/SQLServer/feedback/CreateFeedback.aspx使用「開發人員工具(SSDT,BIDS等)」類別。

+0

如果您希望腳本2的構建失敗,可以啓用「將Transact-SQL警告視爲錯誤」,並且構建失敗(我喜歡將其作爲一種良好實踐啓用),儘管您可以部署代碼將不會運行(直到表創建) –

+0

感謝您的反饋,這是一個非常透徹的洞察力,我知道會證明是有用的。我打算今天再看一遍,但在此期間: 將Transact-SQL警告視爲錯誤確實會導致警告爲錯誤,但不會出現此錯誤。此問題實際上並未在警告下記錄。但是,它在輸出標籤中顯示爲警告。 在這種情況下,發佈是一個乾淨的發佈,所以目標數據庫在發佈之前不存在。我相信但是會重新檢查表格是否被定義。這會讓我回到場景1,但正如我所說,我會重新檢查這一點。 – SQuirellingAlong