0

在Visual Studio中,假設您已經擁有SQL 2008數據庫項目,並向表中添加了不可爲空的列。當您現在部署數據庫時,如果該表中有數據,則應該失敗。 (對嗎?)如何編寫自定義邏輯,以便在更新期間可以將此列設置爲「x」或使用更高級的查詢或光標來更新整個表並填寫新列?這是您只想要發生一次的事情 - 同時列已添加到數據庫中。有沒有這方面的支持?Visual Studio 2010 SQL Server 2008數據庫項目 - 自定義更新

回答

0

這是我最終做的。

  1. 將版本信息添加到數據庫(例如在SystemSettings表中)。
  2. 爲下一個版本創建一個腳本(例如1.1.0.0.sql)。
  3. 腳本中的\部署後\ Script.PostDeployment.sql文件,添加以下內容:

DECLARE @versionMajor INT;
DECLARE @versionMinor INT;
DECLARE @versionBuild INT;
DECLARE @versionRevision INT;

SELECT TOP 1
        @versionMajor = VersionMajor,
        @versionMinor = VersionMinor,
        @versionBuild = VersionBuild,
        @versionRevision = VersionRevision
FROM SystemSettings;

IF(@versionMajor < = 1 AND @versionMinor < 1)
BEGIN
:R 「.. \升級\ 1.1.0.0.sql」
END

這將運行1.1。如果數據庫版本較低,則爲0.0腳本。1.1.0.0腳本將數據庫版本號更新爲最後一步。未來的更新只需要添加另一個IF塊。

+0

請小心此解決方案。假設你的1.1.0.0.sql查詢TableX。如果在更高版本中放棄TableX,則必須更新該腳本。隨着版本數量的增加,在這種情況下您將擁有越來越多的腳本來維護。 – jelbourn 2010-11-04 13:31:16

+0

升級腳本按順序運行,除非我誤解您的評論,否則這不應該成爲問題。 – 2011-03-02 23:41:19

0
update mytable 
set newcolumn = 'x' 
where newcolumn is null; 
+0

是的 - 但請閱讀我的問題。我正在討論將這種類型的腳本集成到SQL數據庫項目部署中。 – 2010-11-03 02:06:42

+0

@Josh M:爲什麼downvote?您沒有指定部署哪個工具,除了「SQL數據庫項目部署」外,還有很多部署方式。 – 2010-11-03 02:10:30

+0

好的 - 標題清楚地說明了我正在使用的工具。 – 2010-11-03 03:24:42

1

我會添加一個可爲空的列,運行UPDATE命令來填充它,並將列更改爲NOT NULL。儘管我使用Visual Studio 2010,但我不使用它來部署。相反,我使用SQL Compare進行部署 - 它會生成一個SQL腳本,它很容易調整。

+0

謝謝。這就是我現在所做的,但我不禁想到必須有一種更自動化的方式來做到這一點。 – 2010-11-03 03:26:28

0

我對this type of topic做了大量的研究,可惜它似乎是VSDB項目缺乏的領域。開始尋找的好地方是Visual Studio ALM Rangers guide VSDB項目;他們有一個動手實驗室詳細介紹了他們推薦的最佳實踐,以完成你所要求的事情(包括使用部署前和部署後的腳本從臨時表複製數據)。此外,Barclay Hill的博客有關於您的問題的article(他是Data Tools的高級項目經理),與本指南相同。

此推薦的方法在我看來,作爲具有非常高的維護成本,如果你必須要能夠更新多個不同版本的目標數據庫的,但如果你只有一個數據庫(或模式的一個版本)更新,這是相當可行的。

+0

謝謝,我會看看。 – 2010-11-03 03:27:41

1

下面是我如何做到這一點。

在架構瀏覽器中打開表創建腳本,並添加像這樣的新欄目:

[first_name]  varchar(32) NOT NULL default ' ', 
[last_name]   varchar(32) NOT NULL default ' ', 

因爲他們有一個* 默認值*他們可以成功部署。

然後在我的安裝後腳本中檢查表中的值,並運行更新以填充它們,如果是的話。或者代碼可以修復它。

相關問題