2012-07-16 73 views
1

我們有一個通過TFS,TFS數據庫項目和vsdbcmd的自動生成過程。將數據庫項目部署到數據庫服務器時,生成的SQL腳本會嘗試「ALTER」某些存儲過程,即使這些存儲過程在目標數據庫中尚不存在網絡。相反,SQL腳本應該包含這些存儲過程的「CREATE」語句。這顯然會導致數據庫部署失敗,因爲無法「ALTER」不存在的存儲過程。VSDBCMD生成不正確的SQL更新文件

有沒有人有任何想法可能會導致這種情況,或如何解決它?

回答

0

發現錯在哪裏: 在TFS中,表定義沒有模式前綴。因此,而不是(例如)

CREATE TABLE [dbo][TableName] 

CREATE TABLE [TableName] 

缺少指定的架構意味着,當QA vsdbcmd跑,分配給表的模式是單個運行的默認模式vsdbcmd。那麼什麼實際創建是有效我們彷彿規定:

CREATE TABLE [QAUser_SCHEMA].[TableName] 

這導致vsdbcmd,當後來被另一個人,其默認模式爲[DBO]接受我們看到的錯誤,基本上產生運行ALTER語句,因爲存儲過程已經創建,儘管在不同的模式下。

有人會認爲,即使最初指定了不正確的模式,一旦爲該過程指定了[dbo]模式,它將被視爲「不同」過程,但事實並非如此。刪除過程的原始版本(使用[QAUser_SCHEMA]),然後重新運行vsdbcmd解決了問題。

TLDR; 始終在數據庫項目中使用模式名稱前綴數據庫對象。

2

你使用VSDBCMD部署到目標數據庫嗎? VSDBCMD應該輸入一個.dbschema文件和一個連接字符串,並且它會生成一個合適的SQL文件。如果您在指向其他數據庫的同時生成了SQL文件,那麼它將無法在處於不同狀態的數據庫服務器上運行。

+0

這似乎只是問題 - 連接字符串指向正確的目標連接字符串,但它仍然會生成不正確的SQL文件。 – 2012-07-16 15:40:19

1

我們在我們的TFS構建中使用了一個類似的過程,我非常確定這成功地處理了新插入的元素(表,列,SP,索引等)。

起初,我們用一個調用VSDBCMD產生舊的數據庫的.dbschema:

/a:import /dsp:sql /model:C:\PATH\old.dbschema /cs:"Server=SQLSERVER;Integrated Security=False;Pooling=False;Initial Catalog=OLDDB;User=username;Password=password; 

然後我們,我們將生成數據庫,這在前面的步驟一直是最新狀態的.dbschema部署(通過的MSBuild):

/a:import /dsp:sql /model:C:\PATH\new.dbschema /cs:"Server=SQLSERVER;Integrated Security=False;Pooling=False;Initial Catalog=NEWDB;User=username;Password=password; 

我們終於調用VSDBCMD第三次,所以它生成的ALTER:

/a:deploy /dsp:sql /model:C:\PATH\new.dbschema /targetmodelfile:C:\PATH\old.dbschema /DeploymentScriptFile:C:\PATH\DB_Alter.sql /p:Targetdatabase="DB" 

生成的DB_Alter.sql可以應用於運行DB前一狀態的生產SQL,以便將其形成最新狀態。

你所暗示的可以追溯到你沒有正確地形成VSDBCMD參數,或者是該工具的直接錯誤。在你的地方,我會手動對這個工具進行實驗,以確保兩者適用。
據我所知,上述程序工作正常,所以我傾向於認爲你的實現有問題。

+0

就像那樣。原來這是用戶錯誤。見下文。謝謝。 – 2012-07-17 21:20:12