2009-02-02 338 views
7

我們通常會更改表中的現有數據庫表,存儲過程,函數或參數以進行軟件升級/錯誤修復。當需要將更改部署到其他環境(如生產或預生產)時,我們的db更改的某些部分會被遺忘。數據庫部署最佳實踐

在我們公司,一些開發人員使用數據庫差異分析應用程序來了解測試和生產環境之間的差異。 一些開發人員存儲t-sql,他們在db上做的每一項改變都和我一樣。

我想知道你在做什麼來將db更改部署到生產環境中。你爲什麼選擇這種方式?或者必須做什麼?

感謝您的回覆!

回答

1

腳本和存儲您在SQL中所做的每一項更改都是IMO的最佳方式。

2

在一個項目中,我在DDL腳本中更改了所有數據庫更改。這些腳本包含將數據庫升級到特定版本所需的SQL語句。 腳本的文件名還包含數據庫將要升級到的版本號(_versionnumber.sql)

接下來,我有一個小型應用程序,它將數據庫升級到最新版本,通過以正確的順序(從數據庫的當前版本到最後一個腳本文件)執行這些腳本文件。

對於新項目,我現在使用Migrator.NET。這個框架可以讓你在C#類中編寫你的數據庫更改。該框架有一個控制檯應用程序,您可以使用它執行數據庫更改,也可以將其與msbuild一起使用。

2

每個數據庫對象都應該存儲在版本控制系統中的單獨文件中。版本控制系統可以包含文件就像這個例子:

|- tables 
    |- employees.sql 
    |- contracts.sql 
|- packages 
    |- contract_api.sql 
|- functions 
    |- get_employee_name.sql 
...etc... 

每當你修改某些數據庫對象,那麼還必須修改相應的SQL(DDL)文件的版本控制系統。例如,如果您修改包contract_api,則更新文件contract_api.sql。由於該文件已被修改 - 可以通過連續集成引擎進行安裝。

但是,正如你所知,有DDL腳本,不能執行兩次。例如'CREATE TABLE mytable ...'腳本只能執行一次。如果你的系統已經投入生產,那麼你不能在'CREATE TABLE ...'腳本的頭文件中提供'DROP TABLE mytable'語句。因此,對於生產系統,您需要創建所謂的增量腳本,它只會提供更改。在這種情況下,您可以簡單地創建一個名爲employees_upd01.sql的新文件,其中包含語句'ALTER TABLE mytable ADD COLUMN ...'。

一段時間後,你的倉庫看起來是這樣的:

|- tables 
    |- employees.sql 
    |- employees_upgr20091001.sql 
    |- employees_upgr20091004.sql 
    |- contracts.sql 
|- packages 
    |- contract_api.sql 
|- functions 
    |- get_employee_name.sql 
...etc... 

這是OK的,因爲: 1)當您需要提供今天的增量更改數據庫 - 你今天部署修改過的文件2)如果您需要部署系統的全新安裝 - 您將按順序運行所有腳本,例如第一employees.sql,然後employees_upgr20091001.sql

由於每個數據庫對象是在版本控制系統中一個單獨的文件,你必須對所有變化的良好控制。