我們現正檢討我們如何存儲我們的數據庫腳本(表,特效,功能,視圖,數據修正)在顛覆,我想知道是否有以任何共識是什麼是最好的方法?什麼是數據庫腳本代碼控制下的最佳實踐
一些我們需要考慮的因素包括:
- 我們應該籤「創建」腳本或「阿爾特」腳本簽入增量變化
- 我們如何跟蹤的狀態對於給定的釋放
- 數據庫應該很容易從頭開始建立一個數據庫,對於任何給定的發行版本
- 如果一個表存在於數據庫中列出已對其運行的腳本或數據庫等版本。
顯然,這是一個相當開放式的問題,所以我渴望聽到什麼人的經驗告訴他們。
我們現正檢討我們如何存儲我們的數據庫腳本(表,特效,功能,視圖,數據修正)在顛覆,我想知道是否有以任何共識是什麼是最好的方法?什麼是數據庫腳本代碼控制下的最佳實踐
一些我們需要考慮的因素包括:
顯然,這是一個相當開放式的問題,所以我渴望聽到什麼人的經驗告訴他們。
創建腳本選項:
使用創建腳本,將建立你的最新版本從無到有的數據庫,這是除了默認的查找數據空。
使用標準的版本控制技術來存儲,分支,標籤版本,並查看你的對象的歷史。
在升級的實時數據庫(你不想失去的數據),在新版本中創建數據庫的空白第二個副本,並使用像紅色門的link text
優點的工具: 變化對文件進行跟蹤在一個標準的源代碼一樣的方式
缺點: 依靠手動使用第三方工具做實際的升級(無/小自動化)
你可以通過閱讀如何得到一些提示這是通過Ruby On Rails' migrations完成的。 理解這一點的最好方法可能是自己嘗試一下,然後手動檢查數據庫。
解答您的每一個因素:
我的兩分錢!
升級腳本選項
在數據庫中存儲作爲一個單獨的SQL腳本,每一個變化。將每組更改存儲在編號文件夾中。使用腳本一次應用更改文件夾,並在數據庫中記錄已應用的文件夾。
優點: 全自動的,可測試的升級路徑
缺點: 很難看到每個元素 的全部歷史不得不從頭開始建立一個新的數據庫,通過所有的版本會
我傾向於檢查最初的創建腳本。然後我的數據庫中有一個DbVersion表,我的代碼使用它在必要時在初始連接上升級數據庫。例如,如果我的數據庫處於版本1,而我的代碼處於版本3,則我的代碼將應用ALTER語句以將其引入版本2,然後傳遞到版本3.我爲此使用了一個簡單的fallthrough switch語句。
這樣做的好處是,當您部署新版本的應用程序時,它將自動升級舊數據庫,並且您不必擔心數據庫與軟件不同步。它也保持一個非常明顯的變化歷史。
這不是所有軟件的好主意,但可以應用變體。
我們公司檢查他們只是因爲有人決定把它放在我們所做的一些SOX文檔中。除了可能作爲參考文件之外,它對我來說根本沒有意義。我看不出有什麼時候我們會把它們拉出來,然後嘗試再次使用它們。如果我們這樣做了,我們就必須知道哪一個先運行,哪一個運行。備份數據庫比保留Alter腳本更重要。
經過幾次反覆,我們採取的方法是大致是這樣的:
每個表和每個存儲過程一個文件。還爲其他事情分開文件,如設置數據庫用戶,使用他們的數據填充查找表。
表格的文件以CREATE命令開始,隨着模式的演變而添加一系列ALTER命令。每個這些命令都包含在測試中,以確定表或列是否已經存在。這意味着每個腳本都可以在最新的數據庫中運行,並且不會改變任何內容。這也意味着,對於任何舊數據庫,腳本都會將其更新爲最新模式。而對於一個空的數據庫,CREATE腳本創建表並且ALTER腳本全部被跳過。
我們還有一個程序(用Python編寫)掃描完整腳本的目錄並將它們組裝成一個大腳本。它解析SQL足以推斷表之間的依賴關係(基於外鍵引用)並對它們進行適當的排序。其結果是一個怪胎SQL腳本,一次性獲取數據庫的規格。腳本組裝程序還會計算輸入文件的MD5散列值,並使用它來更新寫入列表中最後一個腳本中的特殊表格的版本號。
除非事故發生,結果是給定版本的源代碼的數據庫腳本創建了此代碼旨在與之互操作的架構。這也意味着有一個(比較大的)SQL腳本可以給客戶建立新的數據庫或更新現有的數據庫。 (在這種情況下,這很重要,因爲數據庫會有很多實例,每個客戶都有一個實例。)
有一個在這個環節一篇有趣的文章: http://www.codinghorror.com/blog/archives/001050.html
它主張基線「創造」的腳本,然後在「ALTER」腳本檢查和保持版本數據庫中的表。
對於每個版本,我們需要給一個update.sql文件,其中包含所有新的表腳本,alter語句,新的/修改的包,角色等。此文件用於將數據庫從1版本升級到2.
我們在update.sql文件中包含的以上所有這些語句都需要轉到各個文件。像alter語句必須以新列表的形式(表格腳本必須被修改而不是Alter語句在創建表格腳本之後添加)以新的表格,角色等方式進入表格。
因此,每當用戶想要升級他會使用第一個update.sql文件進行升級。 如果他想從scrach構建,那麼他將使用已經擁有所有上述語句的build.sql,它會使數據庫同步。
sriRamulu [email protected]
我們在Subversion中創建一個分支,所有的下一個版本的數據庫更改腳本出來,並進行檢查。所有的腳本是可重複的,所以你可以不用多次運行它們錯誤。
我們還將更改腳本鏈接到問題項目或bug ID,以便我們可以在需要時阻止更改集。然後,我們有一個自動化的構建過程,查看我們正在發佈的問題項目,並從Subversion中提取更改腳本,並創建一個SQL腳本文件,其中所有更改均已正確排序。
然後使用此單個文件來促進對測試,質量保證和生產環境的更改。自動構建過程還會創建記錄版本的數據庫條目(分支和構建ID)。我們認爲這是企業開發人員的最佳方法。我們如何做到這一點的更多細節可以發現HERE
就我而言,我建立一個SH腳本這項工作:https://github.com/reduardo7/db-version-updater
有一個在新的網址一篇有趣的文章:https://blog.codinghorror.com/get-your-database-under-version-control/
它有點舊,但概念仍然存在。好閱讀!
我確信他們只是從SOX文檔的角度來看,所以你有一些事情可以向審覈員(如果他們問)顯示什麼樣的變化。 – 2008-12-04 14:17:13