使用SQLCompare命令行來自動化數(shù)據(jù)庫部署

SQL Compare是一款比較和同步SQL Server數(shù)據(jù)庫結(jié)構(gòu)的工具?,F(xiàn)有超過150,000的數(shù)據(jù)庫管理員、開發(fā)人員和測試人員在使用它。當(dāng)測試本地數(shù)據(jù)庫,暫存或激活遠程服務(wù)器的數(shù)據(jù)庫時,SQL Compare將分配數(shù)據(jù)庫的過程自動化。

讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:主機域名網(wǎng)站空間、營銷軟件、網(wǎng)站建設(shè)、河曲網(wǎng)站維護、網(wǎng)站推廣。

我們的團隊為商業(yè)組織開發(fā)實際應(yīng)用程序;主要是格魯吉亞銀行。這些應(yīng)用程序基于MS SQL Server作為數(shù)據(jù)庫的.Net-Windows-Forms應(yīng)用程序。它們具有許多業(yè)務(wù)邏輯,這些邏輯包含在數(shù)據(jù)庫例程中,例如存儲過程、函數(shù)、視圖和SQL CLR。

毫不奇怪,考慮到客戶業(yè)務(wù)的性質(zhì),我們沒有訪問客戶數(shù)據(jù)庫或數(shù)據(jù)進行開發(fā)、測試或部署的權(quán)限。在TFS源代碼管理下,我們只有開發(fā)數(shù)據(jù)庫及其人工測試數(shù)據(jù)。開發(fā)人員在自己的數(shù)據(jù)庫副本上工作,每個副本都有自己的示例數(shù)據(jù),并且他們使用Redgate SQL Source Control提交開發(fā)更改。然后,我們使用SQL Compare命令行來自動化數(shù)據(jù)庫部署。在本文中,我將解釋如何實現(xiàn)此目標,并舉例說明如何比較相同或不同分支中的數(shù)據(jù)庫的兩個修訂版,并生成部署腳本。

在源代碼管理中管理數(shù)據(jù)庫

我們的數(shù)據(jù)庫源代碼控制和分支策略很簡單。我們在Trunk中擁有最新的代碼庫;整個應(yīng)用程序都在那里,包括其中的數(shù)據(jù)庫部分。所有新功能和錯誤修復(fù)最初都在Trunk中進行。我們創(chuàng)建的每個分支只是Trunk的一個副本,因此代表了代碼庫的完整時間點狀態(tài)。在應(yīng)用了一些更改并簽入Trunk之后,我們可以根據(jù)需要將其合并到這些分支中的任何一個。通常,這是為了修復(fù)已報告的錯誤,但當(dāng)對我們的客戶來說很重要時,我們還需要能夠合并小的功能更改。例如,并非每個客戶都能負擔(dān)得起部署每個版本的費用,因此他們部署的版本通常落后三個或四個版本。但是,他們?nèi)匀恍枰覀優(yōu)楫?dāng)前版本部署緊急修復(fù)程序,偶爾會使用一些“專有”功能。

那么,當(dāng)我們開發(fā)軟件時,這一切如何工作?讓我們將其稱為“under-source-control-application”(簡稱USCAPP)。我們在USCAPP_Trunk中擁有最新的代碼庫,并在TFS分支下提供了一些發(fā)行版本,稱為v241、v242等。

直接或通過合并進行的所有更改都可以通過Trunk及其分支的普通TFS檢入完成。在每次簽入時,TFS都會創(chuàng)建一個稱為變更集的東西,它具有唯一的參考號。變更集表示源代碼管理中整個代碼庫的快照。像任何其他源代碼控制系統(tǒng)一樣,TFS可以針對任何給定的變更集編號,為任何修訂生成代碼庫的時間點狀態(tài)。

當(dāng)然,對于集合中的所有TFS項目(包括其分支機構(gòu)),TFS變更集編號都是全局的,并且每次對該項目集合進行每次檢入時,TFS變更集編號都將逐漸增加。對我們來說,這意味著USCAPP_Trunk及其所有分支v241、v242等都共享相同的、全球的、不斷增長的變更集號。

開發(fā)人員進行更改,每個人都在自己的專用數(shù)據(jù)庫上工作,并通過SQL Source Control簽入更改,這些更改將更新USCAPP_Trunk中的代碼。根據(jù)需要,我們將所需的變更集合并到其他分支,在這些分支中創(chuàng)建新的變更集。因此,假設(shè)最新版本為v245,并且我們知道客戶A已將v242部署到生產(chǎn)環(huán)境中。該客戶尚不能升級到最新版本,但已部署了一個附加的升級腳本以修復(fù)一些錯誤并進行一些小的改進。換句話說,客戶A正在運行非常特定的v242版本,我們可以將其轉(zhuǎn)換為TFS變更集編號,該編號唯一地標識其已部署的分支v242的代碼庫的時間點狀態(tài)。

使用SQL Compare命令行自動生成更改腳本

我們的目標是使生成同步SQL腳本的過程自動化,該腳本覆蓋自上次發(fā)布腳本以來發(fā)生的所有更改。

假設(shè)客戶A已經(jīng)部署了分支v242,并且該數(shù)據(jù)庫的發(fā)行版本標記有人類可讀的版本號2.4.2.0,該版本號對應(yīng)于變更集編號87300,即它是在變更集87300是當(dāng)前最新版本時發(fā)布的代碼庫的全局變更集編號。

此后一個月過去了,我們已經(jīng)在數(shù)據(jù)庫中進行了更改,現(xiàn)在TFS中當(dāng)前的更改集數(shù)量為88100?,F(xiàn)在,我們要生成一個腳本,其中包含當(dāng)月所做的每個更改,因此將數(shù)據(jù)庫的v2.4.2.0升級到變更集編號88100表示的狀態(tài),我們將其稱為v2.4.2.1。

為此,我們需要從TFS中檢索數(shù)據(jù)庫的兩個時間點狀態(tài),一個代表源數(shù)據(jù)庫(不會改變),另一個代表目標數(shù)據(jù)庫(我們要升級)。因此,對于客戶A,變更集88100代表源,而87300代表目標。我們需要比較這兩種狀態(tài)以找出差異,然后生成一個腳本以同步目標,以便其狀態(tài)與源相同。對于兩個數(shù)據(jù)庫中都存在但有差異的任何數(shù)據(jù)庫對象,必須更改目標中對象的定義以匹配其在源中的定義。應(yīng)該創(chuàng)建源中存在但目標中不存在的任何對象,應(yīng)該刪除目標中存在但源中不存在的任何對象。

好消息是,我們不必手動執(zhí)行此操作。SQL Compare GUI和SQL Compare命令行均支持此功能。我們希望使該過程自動化,因此我們使用命令行并將適當(dāng)?shù)膮?shù)傳遞給該命令行以生成同步腳本。我們還需要仔細記錄該腳本將數(shù)據(jù)庫的2.4.2.0版本升級到v2.4.2.1。當(dāng)然,這里我們也需要一些保護措施。其中一項是檢查,該檢查將停止在不是v2.4.2.0的任何數(shù)據(jù)庫上運行此腳本。在這里,我不會進行演示,但是最后,我將更詳細地討論這些需求。

比較同一分支中的兩個修訂

首先,我將描述我們?nèi)绾伟l(fā)布稱為“修復(fù)”的腳本,該腳本主要用于部署一些錯誤修復(fù)和較小的改進。主要版本保持不變。

我們使用SQL Compare命令行進行此操作,傳遞一個XML參數(shù)文件(argfile),該文件包含指示SQL Compare如何執(zhí)行比較的所有必需命令行開關(guān)的值?;蛘撸梢灾付恳粋€到命令行的開關(guān),或在PowerShell中“splat”參數(shù)。

在這種情況下,唯一需要傳遞給SQL Compare的參數(shù)是XML Argfile的合格文件名,稱為“shared.xml”

“%programfiles(x86)%\?Red?Gate?\?SQL?Compare?13?\?sqlcompare”?/Argfile:"shared.xml“

argfile的內(nèi)容應(yīng)完全按照SQL Compare命令行的在線文檔中的說明填寫。這是真實的示例:

<commandline>
??<SourceControl1?/>
??<Revision1>88100</Revision1>
??<SourceControl2?/>
??<Revision2>87300</Revision2>
??<Options>NoDeploymentLogging,IgnoretSQLt,IgnoreFillFactor,IgnoreWhiteSpace,IgnoreFileGroups,IgnoreUserProperties,IgnoreWithElementOrder,IgnoreDatabaseAndServerName,CaseSensitiveObjectDefinition,ObjectExistenceChecks,DropAndCreateInsteadofAlter,ForceColumnOrder,DoNotOutputCommentHeader,IgnoreUsersPermissionsAndRoleMemberships</Options>
??<ScriptsFolderXML>Command?Line\SourceControlAddress?v242.xml</ScriptsFolderXML>
??<Filter>Command?Line\Filters\Shared.scpf</Filter>
??<ReportType>Interactive</ReportType>
??<Report>Command?Line\Output\Shared.html</Report>
??<ScriptFile>Command?Line\Output\Shared.sql</ScriptFile>
??<Force?/>
??<Verbose?/>
</commandline>

Argfile包含五個命令行開關(guān),我們使用它們來定義所需的行為。/ Sourcecontrol1和/ Sourcecontrol2切換指定我們的源,和目標,是源控制腳本的一個文件夾,在這種情況下,版本分別為88100和87300。

<SourceControl1?/>
<Revision1>88100</Revision1>
<SourceControl2?/>
<Revision2>87300</Revision2>

所述<ScriptsFolderXML>開關(guān)包含完整的文件路徑為XML文件,SourceControlAddress v242.xml。該文件如下所示,包含分支v242的數(shù)據(jù)庫的源代碼控制地址:

<?xml?version="1.0"?encoding="utf-16"?standalone="yes"?>
<ISOCCompareLocation?version="1"?type="TfsLocation">
??<ServerUrl>http://tfs:8080/tfs/projects</ServerUrl>
??<SourceControlFolder>$/USCAPP/Branches/v242/Database/Schema</SourceControlFolder>
</ISOCCompareLocation>

這是SQL Compare應(yīng)從中恢復(fù)87300和88100變更集的地址。當(dāng)執(zhí)行SQL Compare的命令行版本時,它將把這些變更集還原為“腳本文件夾”(在撰寫本文時,還原到Windows Temp中的文件夾中),并使用88100作為源和87300作為目標進行比較,以生成最終的升級腳本。

比較兩個不同分支中的數(shù)據(jù)庫

我們用來發(fā)布已經(jīng)在Trunk中完成的所有新功能的過程與錯誤修正版本稍有不同,但是主要概念保持不變。同樣在這種情況下,我們必須比較數(shù)據(jù)庫架構(gòu)的兩個不同狀態(tài)。即使它們的“真理來源”作為TFS源代碼管理中的版本存在,它們也被導(dǎo)出到文件夾,作為Redgate稱為“腳本文件夾”的東西。然后可以將它們作為兩個數(shù)據(jù)庫模式進行比較。在這種情況下,不同之處在于我們不是在一個TFS分支中比較由變更集表示的兩個修訂版(或時間點狀態(tài)),而是在現(xiàn)在表示版本的兩個分支之間進行比較。

要逐步進行:該過程首先從Trunk分支中創(chuàng)建一個新分支,并為其指定一個適當(dāng)?shù)拿Q。例如,如果v2.4.2是USCAPP應(yīng)用程序的最后發(fā)行版本,那么在發(fā)行該版本時,我們已經(jīng)創(chuàng)建了一個名為v242的分支?,F(xiàn)在,我們已經(jīng)對Trunk進行了更多更改,從邏輯上講,我們將發(fā)布v2.4.3版本,因此我們的新分支將稱為v243,從那時開始,就其所包含的內(nèi)容而言,它將作為Trunk分支的確切副本。

現(xiàn)在,我們應(yīng)該比較兩個單獨分支的兩個變更集。我們用于比較的變更集必須是剛剛創(chuàng)建的新v243分支的變更集,并且是客戶A已應(yīng)用的上一個分支v242的最新發(fā)布的部署腳本所對應(yīng)的變更集。此比較將揭示僅在Trunk的數(shù)據(jù)庫上發(fā)生的更改,而上一個分支v242的數(shù)據(jù)庫中缺少這些更改。

為此,我們需要指定一個而不是兩個源代碼管理文件夾位置,一個用于包含源/?ScriptsFolderXML1的TFS分支,另一個用于包含目標/?ScriptsFolderXML2的分支。我們使用SQL Compare保留關(guān)鍵字“HEAD”來指定我們想要源分支的最新的源控件更改集。生成的Argfile如下所示:

<commandline>
??<SourceControl1?/>
??<Revision1>HEAD</Revision1>
??<SourceControl2?/>
??<Revision2>88100</Revision2>
??<Options>NoDeploymentLogging,IgnoretSQLt,IgnoreFillFactor,IgnoreWhiteSpace,IgnoreFileGroups,IgnoreUserProperties,IgnoreWithElementOrder,IgnoreDatabaseAndServerName,CaseSensitiveObjectDefinition,ObjectExistenceChecks,DropAndCreateInsteadofAlter,ForceColumnOrder,DoNotOutputCommentHeader,IgnoreUsersPermissionsAndRoleMemberships</Options>
??<ScriptsFolderXML1>Command?Line\SourceControlAddress?v243.xml</ScriptsFolderXML1>
??<ScriptsFolderXML2>Command?Line\SourceControlAddress?v242.xml</ScriptsFolderXML2>
??<Filter>Command?Line\Filters\Shared.scpf</Filter>
??<ReportType>Interactive</ReportType>
??<Report>Command?Line\Output\Shared.html</Report>
??<ScriptFile>Command?Line\Output\Shared.sql</ScriptFile>
??<Force?/>
??<Verbose?/>
</commandline>

這是目標的源代碼管理腳本位置XML文件(SourceControlAddress v242.xml):

<?xml?version="1.0"?encoding="utf-16"?standalone="yes"?>
<ISOCCompareLocation?version="1"?type="TfsLocation">
??<ServerUrl>http://tfs:8080/tfs/projects</ServerUrl>
??<SourceControlFolder>$/USCAPP/Branches/v242/Database/Schema</SourceControlFolder>
</ISOCCompareLocation>

這是源代碼之一(SourceControlAddress v243.xml):

<?xml?version="1.0"?encoding="utf-16"?standalone="yes"?>
<ISOCCompareLocation?version="1"?type="TfsLocation">
??<ServerUrl>http://tfs:8080/tfs/projects</ServerUrl>
??<SourceControlFolder>$/USCAPP/Branches/v243/Database/Schema</SourceControlFolder>
</ISOCCompareLocation>

再一次,我們僅使用Argfile的地址作為唯一參數(shù)來調(diào)用SQL Compare命令行:

“%programfiles(x86)%\?Red?Gate?\?SQL?Compare?13?\?sqlcompare”?/Argfile:"shared.xml“

在SQL Compare命令行完成其工作之后,在“Shared.sql” 文件中,我們有了可以在目標數(shù)據(jù)庫上運行的升級腳本,以將其升級到最新的主要版本。

進一步要求

在現(xiàn)實生活中,我們始終需要仔細檢查自動生成的腳本,添加檢查和控件,以確保例如以正確的順序?qū)⑺斜匦璧纳壞_本應(yīng)用到預(yù)期的數(shù)據(jù)庫版本。我們還需要對SQL Compare的自動生成的部署腳本進行少量添加和自定義,例如處理數(shù)據(jù)插入或向每個腳本添加標頭信息(創(chuàng)建腳本時,版權(quán)信息,聯(lián)系信息等)。 或在每個自動生成的腳本的末尾附加一些動態(tài)生成的SQL腳本,以識別客戶。

通過使用自定義遷移腳本修改SQL Compare部署,可以實現(xiàn)很多這樣的目標,盡管實際上我們遇到了一些困難,例如它們減慢了SQL Source Control的運行速度或部署前和部署后腳本。

對我們來說,另一個需要考慮的因素是,SQL Compare遷移和部署前或部署后腳本是靜態(tài)的,而我們的要求是動態(tài)生成的腳本。相反,我們在Visual Studio中構(gòu)建了一個簡單,輕便的工具,允許開發(fā)人員對SQL Compare腳本進行小的動態(tài)添加和自定義。

我避免在這里進行深入研究的另一個復(fù)雜性是,對于我們的每個客戶,我們的源代碼管理干線將客戶數(shù)據(jù)庫的所有共享邏輯與包含該組織專有的定制代碼的小型例程結(jié)合在一起。在本文中,我演示了如何使用SQL Compare命令行來部署所有客戶通用的數(shù)據(jù)庫結(jié)構(gòu)和代碼。盡管該過程與特定于客戶的例程基本相同,但是需要進行一些小的調(diào)整,以確保始終將獨有功能僅部署到該客戶的生產(chǎn)數(shù)據(jù)庫中,并且沒有任何客戶可以看到專門為另一位客戶編寫的邏輯。我將在下一篇文章中描述我們?nèi)绾螌崿F(xiàn)這一目標!

結(jié)論

我們的經(jīng)驗是Redgate Source Control和SQL Compare可以協(xié)同工作,并且對我們自動化腳本生成過程起到了很大的作用。SQL Compare允許對其從Git或TFS源代碼控制中提取腳本的方式進行非常精細的控制,從而為我們節(jié)省了大量手動腳本編寫。我們將看到能夠自動生成相應(yīng)的回滾(降級)腳本以及升級腳本的更多可能性。它只需要反轉(zhuǎn)我們用于源和目標的變更集并啟動SQL Compare命令行即可!它是一種多功能工具。

本教程內(nèi)容到這里就結(jié)束了,希望對您有所幫助~

分享標題:使用SQLCompare命令行來自動化數(shù)據(jù)庫部署
網(wǎng)頁網(wǎng)址:http://www.muchs.cn/article22/ihpicc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、網(wǎng)站設(shè)計公司App設(shè)計、企業(yè)網(wǎng)站制作網(wǎng)站制作、軟件開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)