2015-05-20 69 views
9

我的公司使用Visual Studio數據庫項目將更新部署到我們的數據庫。據我所知,它提供了用於比較項目模式和目標數據庫的狀態的功能,並生成用於將後者的模式更新爲前者的代碼。它還提供了一個預部署腳本和一個後部署腳本,但僅此而已。Visual Studio數據庫項目中的版本更新

缺少的是任何版本控制和/或排序的概念。如果我想說,將一個不可爲空的FK列添加到表中,我需要分兩步執行 - 首先,將其添加爲具有後部署腳本的可空列,以更新行以使其具有有意義的值其次,使列不可爲空。這些必須按順序進行。

據我所知,無法通過使用Visual Studio數據庫項目進行部署來確保對部署前和部署後腳本的順序排序。我在這裏嗎?這有兩點含義:首先,一旦創建了表,你不能真正添加​​一個不可爲空的FK列;其次,你的預部署和部署後腳本將不斷增長並且不斷增長幷包含從幾年前開始,因爲它們都是每次運行數據庫部署。

有什麼辦法可以用Visual Studio數據庫項目進行版本更新,如果沒有,是否有允許這種版本控制的項目類型?

+0

你看過Ready-Roll? http://www.ready-roll.com/這是RedGate與Visual Studio集成的一個工具。我認爲這是你以後的樣子。 –

+0

由於您詢問了其他項目類型,請查看[使用遷移的實體框架7](https://channel9.msdn.com/Blogs/Seth-Juarez/Migrations-in-Entity-Framework-7-與-布萊斯-LAMBSON) –

回答

3

首先,你有這個標籤與Visual Studio 2012 - 如果你使用的是該版本,一定要升級到vs 2013或2015,並獲得最新版本的SSDT,因爲發佈每3個月發佈一次新功能並修復所以很值得一個更新的版本 - 我在下面談論的是當前的行爲,我不知道所有這些是否在Visual Studio 2012的原始ssdt中都可用。

有幾件事要說,首先,您可以通過使用/ p:BlockWhenDriftDetected並將數據庫註冊爲數據層應用程序(/ p:RegisterDataTierApplication)來強制進行有序部署。這將允許你這樣做:

  1. 構建dacpac 1
  2. 部署dacpac 1
  3. 構建dacpac 2
  4. 部署dacpac 2
  5. 構建dacpac 3

,將停止您在部署dacpac 1之前無法部署dacpac 2,但這並不理想,因爲如果您在部署dacpac 2之前構建了dacpac 3,那麼您將無法部署出於重建dacpac 3所以它不理想。

當您處理數據庫(任何rdbms,而不僅僅是sql server)的更改時,有時候我們需要分階段發佈更改,對我而言,它更像是一個流程問題,而不是技術問題。我要做的就是:

  1. 創建的變化
  2. 的第一部分中的積壓創建票完成變更
  3. 部署變化
  4. 在部署之後,將來重複,拿起門票完成更改
  5. 部署定稿

有些事情要注意一下:

  • 這需要紀律,以確保你整理和完整的東西,在一個靈活的工作方式,並不意味着草率:)
  • 所以如果你想建立一些靜態數據,你寫的應該是冪等的所有腳本等一樣,如果存在支票或MERGE語句使用的東西,如果你修改任何架構對象包起來是否存在等如果你這樣做,你會發現部署更簡單的體驗

如果按照這個過程而不是依賴版本策略類型的策略,那麼您不必擔心部署dacpacs的順序,如果腳本很重要,請將其保留在post部署腳本中,並在執行腳本之前檢查腳本是否應該做任何工作。如果您的腳本變得太大,您可以使用:•sqlcmd導入將它們分成不同的文件。我也聽說過使用部署存儲過程並從部署後腳本調用這些過程的人員。

我更喜歡一個只需部署dacpac的最新(或特定版本)的進程,因爲這意味着無論您是要進行後期構建還是回退到之前的構建,都可以始終部署到該版本。

最後,在添加不可空的fk列的示例中,可以通過一次部署dacpac來完成此操作。要做到這一點,你會:

  1. 創建新的表定義(包括非空和外鍵約束)
  2. 在您的文章部署腳本在桌子上做一個更新,使其樹立正確的數據(顯然使它冪等,因此它可以留在永遠如果需要的話)
  3. 當你部署啓用/ p:GenerateSmartDefaults

會發生什麼事時,所產生的部署腳本是你得到一個腳本,看起來像:

  • 預先部署腳本(如果有的話)
  • 列創建一個臨時默認約束不爲空
  • 刪除臨時約束
  • 創建NOCHECK外鍵,所以它不是真正enfored
  • 運行後部署腳本
  • 啓用使用「與檢查檢查」

的/ p的外鍵約束:我彪參數的東西ioned是您傳遞給sqlpackage.exe的參數。如果您不使用該功能,但使用其他方式進行部署,則通常可以將這些參數作爲參數傳遞給您,如果您讓我知道您在部署時如何部署,我可以幫助您。有關參數的描述,請參見https://msdn.microsoft.com/en-us/library/hh550080.aspx(sqlpackage.exe命令行語法)。

讓我知道如果您有任何問題,還有一些額外的事情需要考慮,但檢查模式定義並自動生成部署腳本會大大減少部署更改的工作量,這意味着您可以專注於更有用的事情 - 編寫一個單元測試:)。

Ed

相關問題