[sql-server] 版本控制SQL Server數據庫



13 Answers

Red Gate的SQL Compare產品不僅允許您進行對象級別的比較,並從中生成更改腳本,還允許您將數據庫對象導出到由對像類型組織的文件夾層次結構中,同時創建一個[objectname] .sql腳本每個對像在這些目錄中。 對像類型層次結構如下所示:

\功能
\安全
\安全\角色
\安全\架構
\安全\用戶
\存儲過程
\表

如果在進行更改後將腳本轉儲到同一根目錄,則可以使用它來更新SVN回購,並分別保存每個對象的運行歷史記錄。

Question

我想讓我的數據庫受版本控制。 有沒有人有任何建議或推薦的文章,讓我開始?

我會一直希望至少有一些數據在那裡(如alumb提到:用戶類型和管理員)。 我還經常需要大量的生成測試數據來進行性能測量。




我們不存儲數據庫模式,我們將更改存儲到數據庫。 我們所做的是存儲模式更改,以便為任何版本的數據庫構建更改腳本並將其應用到我們客戶的數據庫。 我編寫了一個數據庫實用程序應用程序,它可以與我們的主應用程序一起分發,它可以讀取該腳本並知道需要應用哪些更新 它也有足夠的智能來根據需要刷新視圖和存儲過程。




我們使用DBGhost來管理我們的SQL數據庫。 然後,您將腳本在您的版本控制中構建一個新的數據庫,並且它將構建新的數據庫,或者將任何現有的數據庫升級到版本控制中的模式。 這樣,您不必擔心創建更改腳本(儘管您仍然可以這樣做,例如,如果您想更改列的數據類型並需要轉換數據)。




這很簡單。

  1. 當基礎項目準備就緒時,您必須創建完整的數據庫腳本。 這個腳本被委託給SVN。 它是第一個版本。

  2. 之後,所有開發人員創建更改腳本(ALTER ...,新表格,sprocs等)。

  3. 當你需要當前版本時,你應該執行所有新的更改腳本。

  4. 當應用程序被釋放到生產中時,你會回到1(但它會成為課程的後續版本)。

南特將幫助您執行這些更改腳本。 :)

記住。 有紀律的時候一切正常。 每次數據庫更改被提交時代碼中的相應函數也被提交。




使用更改腳本將數據庫腳本保存到版本控制中是一種好方法,以便您可以升級任何一個數據庫。 您也可以保存不同版本的模式,以便您可以創建完整的數據庫,而無需應用所有更改腳本。 處理腳本應該是自動的,這樣你就不必手動工作。

我認為為每個開發人員分配一個數據庫並且不使用共享數據庫非常重要。 這樣開發人員就可以獨立於其他開發人員創建測試用例和開發階段。

自動化工具應該具有處理數據庫元數據的手段,該手段告訴哪些數據庫處於何種開發狀態以及哪些表包含版本可控數據等等。




這是一個非常古老的問題,但是很多人現在都試圖解決這個問題。 他們所要做的就是研究有關Visual Studio數據庫項目。 沒有這個,任何數據庫開發看起來都很虛弱。 從代碼組織到部署到版本控制,它簡化了一切。




首先,您必須選擇適合您的版本控制系統:

設置存儲庫後,如果中央版本控制系統是工作文件夾,則可以閱讀本文 。 它展示瞭如何使用以下方法在開發環境中設置源代碼管理:

  • SQL Server Management Studio通過MSSCCI提供程序,

  • Visual Studio和SQL Server數據工具

  • 第三方工具ApexSQL源代碼控制



前一段時間,我發現一個VB BAS模塊,它使用DMO和VSS對象將整個數據庫腳本化並轉換為VSS。 我把它變成了一個VB腳本並在here發布。 您可以輕鬆地取出VSS調用並使用DMO內容生成所有腳本,然後從調用VBScript的同一批處理文件調用SVN來檢查它們?

戴夫J




我前一段時間編寫了這個應用程序, http://sqlschemasourcectrl.codeplex.com/ //sqlschemasourcectrl.codeplex.com/將隨時掃描您的MSFT SQL數據庫並自動將您的對象(表,視圖,特效,函數,sql設置)轉儲到SVN中。 奇蹟般有效。 我將它與Unfuddle一起使用(它允許我在簽入時獲取警報)




查看DBGhost DBGhost 。 我已經在自動化方式使用了2年,現在效果很好。 它允許我們的數據庫構建發生得很像Java或C構建,除了數據庫之外。 你知道我的意思。




為了快速轉儲到源代碼控制系統,您可以通過使用sysobjects中的版本信息來查看自上次以來哪些對象發生了更改。

設置:在您想要逐步檢查的每個數據庫中創建一個表,以保存上次檢查時的版本信息(第一次運行時為空)。 如果要重新掃描整個數據結構,請清除此表。

IF ISNULL(OBJECT_ID('last_run_sysversions'), 0) <> 0 DROP TABLE last_run_sysversions
CREATE TABLE last_run_sysversions (
    name varchar(128), 
    id int, base_schema_ver int,
    schema_ver int,
    type char(2)
)

正常運行模式:您可以從此sql中獲取結果,並為您感興趣的那些生成sql腳本,並將它們放入您選擇的源代碼管理器中。

IF ISNULL(OBJECT_ID('tempdb.dbo.#tmp'), 0) <> 0 DROP TABLE #tmp
CREATE TABLE #tmp (
    name varchar(128), 
    id int, base_schema_ver int,
    schema_ver int,
    type char(2)
)

SET NOCOUNT ON

-- Insert the values from the end of the last run into #tmp
INSERT #tmp (name, id, base_schema_ver, schema_ver, type) 
SELECT name, id, base_schema_ver, schema_ver, type FROM last_run_sysversions

DELETE last_run_sysversions
INSERT last_run_sysversions (name, id, base_schema_ver, schema_ver, type)
SELECT name, id, base_schema_ver, schema_ver, type FROM sysobjects

-- This next bit lists all differences to scripts.
SET NOCOUNT OFF

--Renamed.
SELECT 'renamed' AS ChangeType, t.name, o.name AS extra_info, 1 AS Priority
FROM sysobjects o INNER JOIN #tmp t ON o.id = t.id
WHERE o.name <> t.name /*COLLATE*/
AND o.type IN ('TR', 'P' ,'U' ,'V')
UNION 

--Changed (using alter)
SELECT 'changed' AS ChangeType, o.name /*COLLATE*/, 
       'altered' AS extra_info, 2 AS Priority
FROM sysobjects o INNER JOIN #tmp t ON o.id = t.id 
WHERE (
   o.base_schema_ver <> t.base_schema_ver
OR o.schema_ver      <> t.schema_ver
)
AND  o.type IN ('TR', 'P' ,'U' ,'V')
AND  o.name NOT IN ( SELECT oi.name 
         FROM sysobjects oi INNER JOIN #tmp ti ON oi.id = ti.id
         WHERE oi.name <> ti.name /*COLLATE*/
         AND oi.type IN ('TR', 'P' ,'U' ,'V')) 
UNION

--Changed (actually dropped and recreated [but not renamed])
SELECT 'changed' AS ChangeType, t.name, 'dropped' AS extra_info, 2 AS Priority
FROM #tmp t
WHERE    t.name IN ( SELECT ti.name /*COLLATE*/ FROM #tmp ti
         WHERE NOT EXISTS (SELECT * FROM sysobjects oi
                           WHERE oi.id = ti.id))
AND  t.name IN ( SELECT oi.name /*COLLATE*/ FROM sysobjects oi
         WHERE NOT EXISTS (SELECT * FROM #tmp ti
                           WHERE oi.id = ti.id)
         AND   oi.type  IN ('TR', 'P' ,'U' ,'V'))
UNION

--Deleted
SELECT 'deleted' AS ChangeType, t.name, '' AS extra_info, 0 AS Priority
FROM #tmp t
WHERE NOT EXISTS (SELECT * FROM sysobjects o
                  WHERE o.id = t.id)
AND t.name NOT IN (  SELECT oi.name /*COLLATE*/ FROM sysobjects oi
         WHERE NOT EXISTS (SELECT * FROM #tmp ti
                           WHERE oi.id = ti.id)
         AND   oi.type  IN ('TR', 'P' ,'U' ,'V'))
UNION

--Added
SELECT 'added' AS ChangeType, o.name /*COLLATE*/, '' AS extra_info, 4 AS Priority
FROM sysobjects o
WHERE NOT EXISTS (SELECT * FROM #tmp t
                  WHERE o.id = t.id)
AND      o.type  IN ('TR', 'P' ,'U' ,'V')
AND  o.name NOT IN ( SELECT ti.name /*COLLATE*/ FROM #tmp ti
         WHERE NOT EXISTS (SELECT * FROM sysobjects oi
                           WHERE oi.id = ti.id))
ORDER BY Priority ASC

注意:如果您在任何數據庫中使用非標準歸類,則需要使用數據庫歸類替換/* COLLATE */ 。 即COLLATE Latin1_General_CI_AI




我們剛剛開始使用Team Foundation Server。 如果你的數據庫是中等大小的,那麼Visual Studio有一些很好的項目集成,包括內置的比較,數據比較,數據庫重構工具,數據庫測試框架,甚至數據生成工具。

但是,該模型並不適合非常大的或第三方數據庫(即加密對象)。 所以,我們所做的只是存儲我們自定義的對象。 Visual Studio / Team Foundation Server對此非常有效。

TFS數據庫主管。 博客

MS TFS網站




你也可以看看遷移解決方案。 這些允許您使用C#代碼指定數據庫模式,並使用MSBuild上下滾動數據庫版本。

我目前正在使用DbUp ,並且運行良好。




你可能想看看Liquibase( http://www.liquibase.org/ )。 即使你不使用這個工具,它也能很好地處理數據庫變更管理或重構的概念。






Related