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




database svn version-control (25)

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

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


Answers

對於推薦使用RedGate工具的每個人+1,附加推薦和警告。

SqlCompare也有一個體面的API文檔:例如,您可以編寫一個控制台應用程序,它可以在登錄時將您的源代碼控制的腳本文件夾與CI集成測試數據庫進行同步,以便當有人從其腳本文件夾中檢入對模式的更改時它會隨匹配的應用程序代碼更改而自動部署。 這有助於彌補與忘記將本地數據庫中的更改傳播到共享開發數據庫的開發人員的差距(我認為大約有一半人認為:))。

需要注意的是,通過腳本解決方案或其他方式,RedGate工具足夠流暢,很容易忘記抽象背後的SQL現實。 如果您重命名表中的所有列,SqlCompare無法將舊列映射到新列,並將刪除表中的所有數據。 它會產生警告,但我看到有人點擊過去。 我認為這裡有一個值得一提的觀點,那就是你只能自動完成數據庫版本升級和升級 - 抽像是非常有漏洞的。


在Red Gate,我們提供了一個工具red-gate.com/products/SQL_Source_Control/index.htm ,它使用SQL Compare技術將您的數據庫與TFS或SVN存儲庫相關聯。 這個工具集成到SSMS中,讓你像平常一樣工作,除了它現在可以讓你提交對象。

對於基於遷移的方法(更適合自動化部署),我們提供ReadyRoll ,它將創建和管理一組增量腳本作為Visual Studio項目。

在SQL源代碼管理中,可以指定靜態數據表。 這些作為INSERT語句存儲在源代碼控制中。

如果您正在討論測試數據,我們建議您使用工具或通過您定義的部署後腳本生成測試數據,或者您只需將生產備份恢復到開發環境。


根據我的經驗,解決方案有兩個方面:

  1. 您需要處理開發過程中由多個開發人員完成的對開發數據庫的更改。

  2. 您需要處理客戶站點中的數據庫升級。

為了處理#1,你需要一個強大的數據庫差異/合併工具。 最好的工具應該能夠盡可能地執行自動合併,同時允許您手動解決未處理的衝突。

完美的工具應該使用3路合併算法來處理合併操作,該算法考慮到THEIRS數據庫和MINE數據庫中相對於BASE數據庫所做的更改。

我編寫了一個商業工具,為SQLite數據庫提供手動合併支持,並且我現在增加了對SQLite的3路合併算法的支持。 在http://www.sqlitecompare.com查看

為了處理#2,你需要一個升級框架。

基本思路是開發一個自動升級框架,知道如何從現有的SQL模式升級到新的SQL模式,並可以為每個現有的數據庫安裝構建升級路徑。

查看我在http://www.codeproject.com/KB/database/sqlite_upgrade.aspx關於該主題的文章,以獲得我正在談論的內容的一般概念。

祝你好運

Liron Levi


在遷移到x64平台之後,我們需要對我們的SQL數據庫進行版本升級,而舊版本則隨遷移而中斷。 我們編寫了一個使用SQLDMO將所有SQL對象映射到一個文件夾的C#應用程序:

                Root
                    ServerName
                       DatabaseName
                          Schema Objects
                             Database Triggers*
                                .ddltrigger.sql
                             Functions
                                ..function.sql
                             Security
                                Roles
                                   Application Roles
                                      .approle.sql
                                   Database Roles
                                      .role.sql
                                Schemas*
                                   .schema.sql
                                Users
                                   .user.sql
                             Storage
                                Full Text Catalogs*
                                   .fulltext.sql
                             Stored Procedures
                                ..proc.sql
                             Synonyms*
                                .synonym.sql
                             Tables
                                ..table.sql
                                Constraints
                                   ...chkconst.sql
                                   ...defconst.sql
                                Indexes
                                   ...index.sql
                                Keys
                                   ...fkey.sql
                                   ...pkey.sql
                                   ...ukey.sql
                                Triggers
                                   ...trigger.sql
                             Types
                                User-defined Data Types
                                   ..uddt.sql
                                XML Schema Collections*
                                   ..xmlschema.sql
                             Views
                                ..view.sql
                                Indexes
                                   ...index.sql
                                Triggers
                                   ...trigger.sql

然後應用程序會將新編寫的版本與存儲在SVN中的版本進行比較,如果有差異,它會更新SVN。 我們確定,一晚上運行該流程就足夠了,因為我們沒有對SQL進行很多更改。 它使我們能夠跟踪所有我們關心的對象的變化,並且允許我們在發生嚴重問題時重建我們的完整模式。


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


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

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

TFS數據庫主管。 博客

MS TFS網站


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

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

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


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


為了快速轉儲到源代碼控制系統,您可以通過使用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


典型的解決方案是根據需要轉儲數據庫並備份這些文件。

根據您的開發平台,可能會有開源插件可用。 滾動你自己的代碼來做它通常是相當平凡的。

注意:您可能需要備份數據庫轉儲,而不是將其放入版本控制。 這些文件在版本控制中可能會非常快,並且會導致整個源代碼管理系統變慢(我現在回想起CVS恐怖故事)。


使用VS 2010,使用數據庫項目。

  1. 編寫你的數據庫
  2. 更改腳本或直接在您的數據庫服務器上
  3. 使用數據>模式比較同步

製作完美的數據庫版本解決方案,使數據庫的同步變得輕而易舉。


每個數據庫都應該受源代碼控制。 缺乏的是將所有數據庫對象(和“配置數據”)自動腳本化為文件的工具,然後可以將其添加到任何源控制系統。 如果您使用的是SQL Server,那麼我的解決方案就在這裡: http://dbsourcetools.codeplex.com/ : http://dbsourcetools.codeplex.com/ 。 玩的開心。 - Nathan。


這很簡單。

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

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

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

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

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

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


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

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


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


由於我們的應用必須跨多個RDBMS工作,因此我們使用數據庫中立的Torque格式(XML)將我們的模式定義存儲在版本控制中。 我們還以XML格式版本控制了我們數據庫的參考數據,如下所示(其中“關係”是參考表之一):

  <Relationship RelationshipID="1" InternalName="Manager"/>
  <Relationship RelationshipID="2" InternalName="Delegate"/>
  etc.

然後,我們使用自行開發的工俱生成從數據庫版本X到版本X + 1所需的模式升級和參考數據升級腳本。


您沒有提及任何有關您的目標環境或約束的細節,因此這可能不完全適用......但如果您正在尋找一種方法來有效跟踪不斷變化的數據庫架構,並且不會對使用Ruby,ActiveRecord的遷移就在你的胡同里。

遷移以編程方式使用Ruby DSL定義數據庫轉換; 每個轉換都可以應用或(通常)回滾,允許您在任何給定的時間點跳轉到不同版本的數據庫模式。 定義這些轉換的文件可以像任何其他源代碼一樣檢入版本控制。

由於遷移是ActiveRecord的一部分,因此它們通常用於全棧Rails應用程序; 不過,您可以使用獨立於Rails的ActiveRecord,只需很少的努力。 請參閱here以了解在Rails之外使用AR的遷移的更詳細的處理。


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

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

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


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


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

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

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

  • Visual Studio和SQL Server數據工具

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

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


如果你有一個小的數據庫,並且你想要整個版本的版本, 這個批處理腳本可能會有所幫助。 它將Subversion中的MSSQL數據庫MDF文件分離,壓縮和檢查。

如果您主要想要對模式進行版本控制並只有少量參考數據,則可以使用SubSonic Migrations來處理該數據。 這樣做的好處是,您可以輕鬆地上移或下移到任何特定的版本。


我同意ESV的回答,出於這個確切原因,我開始了一個小項目,以幫助維護一個非常簡單的文件中的數據庫更新,然後可以保持長期的源代碼。 它允許開發人員以及UAT和Production輕鬆更新。 該工具適用於Sql Server和MySql。

一些項目功能:

  • 允許架構更改
  • 允許價值樹人口
  • 允許單獨的測試數據插入例如。 UAT
  • 允許選擇回滾(不自動)
  • 保持對SQL Server和Mysql的支持
  • 有能力通過一個簡單的命令將您現有的數據庫導入到版本控制中(僅適用於sql server ...仍然在使用mysql)

該代碼託管在谷歌代碼上。 請查看Google代碼以獲取更多信息

http://code.google.com/p/databaseversioncontrol/


這是圍繞發展的“難題”之一。 據我所知,沒有完美的解決方案。

如果您只需要存儲數據庫結構而不是數據,則可以將數據庫導出為SQL查詢。 (在企業管理器中:右鍵單擊數據庫 - >生成SQL腳本,我建議在選項選項卡上設置“為每個對象創建一個文件”)然後,可以將這些文本文件提交到svn,並使用svn的diff和logging功能。

我把它與一個帶有幾個參數並設置數據庫的批處理腳本綁定在一起。 我還添加了一些額外的查詢來輸入默認數據,如用戶類型和管理員用戶。 (如果您想了解更多信息,請發布一些內容,然後我可以將腳本放在可訪問的地方)

如果您還需要保留所有數據,我建議保留數據庫的備份並使用Redgate( http://www.red-gate.com/ )產品進行比較。 他們並不便宜,但他們值得每一分錢。


使用別名:

UPDATE t
   SET t.col1 = o.col1
  FROM table1 AS t
         INNER JOIN 
       table2 AS o 
         ON t.id = o.id




sql-server database svn version-control