2014-10-22 127 views
1

在SSDT中使用msbuild,我已經嘗試了IncludeTransactionalScripts,但它似乎只將每個語句放在單個事務中。 是否可以將多個數據庫項目發佈爲事務? 如果沒有,我至少可以確保每個項目都在一個交易中發佈嗎?SSDT交易發佈?

+1

我認爲這如果你選擇了這個選項,現在就這樣做。它在每個操作之後檢查是否有錯誤,以及是否發現在模式更改部分中完成的所有操作都發出ROLLBACK。 (部署前和部署後部分是獨立的,並在此之外) – 2014-10-22 14:38:18

+0

你確定嗎?查看腳本,它會生成多個BEGIN和COMMIT事務,就像每次更改都在自己的事務中一樣。我想爲這個地段做一筆大交易。當然,如果有很多改變,它可能是不切實際的,但有時它可能是有用的。 – SAS 2014-10-24 09:49:27

+1

如果出現錯誤,它肯定會回滾模式更改部分中的所有內容。當我依賴一個尚未創建的DB /表時,我痛苦地試圖推動DB項目的一部分,我知道這一點。在腳本中查找「IF @@ ERROR <> 0」部分,您不應該看到多個提交,只是回滾。 – 2014-10-24 12:58:28

回答

4

對於別人誰發現了這個問題,但不知道去哪裏找:

存在發佈設置「包括交易腳本」,即在發佈腳本的開始開始交易。然後在錯誤檢查中將每個模式更改包裝在腳本中。出錯時,事務回滾並且錯誤日誌遞增,但事務從頭開始。如果沒有錯誤,事務將繼續提交

BEGIN TRANSACTION 

...alter object here 

IF @@ERROR <> 0 @@TRANCOUNT > 0 
BEGIN 
    ROLLBACK; 
END 

IF @@TRANCOUNT = 0 
BEGIN 
    INSERT INTO #tmpErrors (Error) 
    VALUES     (1); 
    BEGIN TRANSACTION; 
END 

最後,如果錯誤已經被註冊,整個事務回滾:

IF EXISTS (SELECT * FROM #tmpErrors) ROLLBACK TRANSACTION 
GO 
IF @@TRANCOUNT>0 BEGIN 
PRINT N'The transacted portion of the database update succeeded.' 
COMMIT TRANSACTION 
END 
ELSE PRINT N'The transacted portion of the database update failed.' 
GO 

音符(上面的評論),這不包括你的部署前/部署後腳本,所以你應該小心分開包裝這些


下面的鏈接是彼得·肖特的博客 - 這是同一個人以上我評論誰認爲 - 謝謝:)

http://schottsql.blogspot.co.uk/2012/11/ssdt-publishing-your-project.html

他解釋說好聽了如何使用SSMS時配置這些設置


使用Visual Studio 2015,我發現默認情況下未設置「包含事務腳本」設置。你必須選擇這個定義發佈設置時([創建] >> [發表{項目名稱} ...])[高級...]選項卡下:

enter image description here enter image description here