翻譯|使用教程|編輯:莫成敏|2020-01-16 15:08:14.557|閱讀 191 次
概述:Giorgi Abashidze解釋了他的團(tuán)隊(duì)如何將兩階段部署過(guò)程與SQL Compare命令行以及一些SQL同義詞一起使用,以自動(dòng)為其每個(gè)客戶進(jìn)行自定義部署,而只需要在源代碼管理中為每個(gè)版本維護(hù)一個(gè)分支。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
SQL Compare是一款比較和同步SQL Server數(shù)據(jù)庫(kù)結(jié)構(gòu)的工具。現(xiàn)有超過(guò)150,000的數(shù)據(jù)庫(kù)管理員、開發(fā)人員和測(cè)試人員在使用它。當(dāng)測(cè)試本地?cái)?shù)據(jù)庫(kù),暫存或激活遠(yuǎn)程服務(wù)器的數(shù)據(jù)庫(kù)時(shí),SQL Compare將分配數(shù)據(jù)庫(kù)的過(guò)程自動(dòng)化。
在本教程中,我將解釋如何使用SQL Compare命令行、同義詞和一些獨(dú)創(chuàng)性來(lái)完成所有這些工作。由于內(nèi)容較多,分為上下兩篇,本文內(nèi)容緊接上文~
使用SQL Compare的兩階段部署
我們將在簡(jiǎn)化的部署示例中稍作擴(kuò)展,并假設(shè)有三個(gè)客戶(Cust1,Cust2和Cust3)都需要定制“有效利率”算法的變體。
部署過(guò)程的第一階段將生成一個(gè)部署腳本,該腳本將交付給每個(gè)客戶數(shù)據(jù)庫(kù)并在每個(gè)客戶數(shù)據(jù)庫(kù)上運(yùn)行。這將使所有通用數(shù)據(jù)庫(kù)例程(即,沒(méi)有名稱以客戶別名結(jié)尾的任何例程)升級(jí)到相同版本。
第二階段生成零個(gè)或多個(gè)特定于客戶的同步腳本,這些腳本僅創(chuàng)建或更新特定于該客戶的SQL例程,這意味著任何例程的名稱都以該消費(fèi)者的別名結(jié)尾,在這種情況下,cust1、cust2或cust3。它還將刪除并重新創(chuàng)建任何同義詞,在本例中為effective_rate同義詞,因此每個(gè)同義詞始終綁定到正確的基礎(chǔ)實(shí)現(xiàn)。
為了滿足這些要求,我們對(duì)所需的每個(gè)同步腳本執(zhí)行一次SQL Compare命令行。
階段1:生成常規(guī)部署腳本
在部署過(guò)程的第一階段,我們通過(guò)提供一個(gè)名為“shared.xml” 的XML argfile,僅執(zhí)行一次SQL Compare CL,并傳入指示其進(jìn)行比較的數(shù)據(jù)庫(kù)的所有參數(shù),以及如何進(jìn)行比較:
“%programfiles(x86)%\ Red Gate \ SQL Compare 13 \ sqlcompare” /Argfile:"shared.xml“
我在上一篇文章中解釋了此Argfile的基本內(nèi)容,但重要的一點(diǎn)是,首先,它是直接從源代碼控制位置比較數(shù)據(jù)庫(kù)的兩個(gè)即時(shí)點(diǎn)版本(新版本和先前版本) ,其次包括對(duì)相應(yīng)過(guò)濾器文件(shared.scpf)的引用。此過(guò)濾器文件使用如下所示的過(guò)濾器表達(dá)式排除任何特定于客戶的模式對(duì)象版本(在這種情況下,任何以Cust1、Cust2或Cust3結(jié)尾的版本):
(@NAME NOT LIKE '%[_]cust1') AND (@NAME NOT LIKE '%[_]cust2') AND (@NAME NOT LIKE '%[_]cust3')
當(dāng)然,如果您的客戶別名都遵循標(biāo)準(zhǔn)模式(如本簡(jiǎn)化示例中的做法),則可以使用更通用的過(guò)濾器,例如(@NAME NOT LIKE' %[_]cust[0-9]')。但是,我們所有的真實(shí)客戶名稱都不相同,因此不可能進(jìn)行這種模式匹配。
因此,SQL Compare將生成一個(gè)SQL同步腳本,該腳本將僅創(chuàng)建effective_rate_default存儲(chǔ)過(guò)程,然后刪除effective_rate同義詞,然后重新創(chuàng)建該同義詞,以使其引用默認(rèn)過(guò)程(CREATE SYNONYM effective_rate FOR effective_rate_default)。
我們將此腳本交付給每個(gè)客戶。
階段2:生成客戶特定的部署腳本
實(shí)際上,對(duì)于每個(gè)客戶,此階段分為兩個(gè)部分:
1、SQL Compare自動(dòng)生成一個(gè)腳本,該腳本將創(chuàng)建或修改所需的特定于客戶的例程
2、我們“重置”每個(gè)客戶數(shù)據(jù)庫(kù)中的所有同義詞,以便它們引用正確的基礎(chǔ)實(shí)現(xiàn)(存儲(chǔ)過(guò)程或函數(shù)等)。為此,我們將所需的代碼“注入”到每個(gè)自動(dòng)生成的自定義腳本的末尾
我們針對(duì)需要自定義代碼的每個(gè)客戶再次執(zhí)行SQL Compare CL,只需每次切換argfile即可指示SQL Compare 僅包含名稱以該客戶的別名結(jié)尾的對(duì)象。我們將所有客戶別名的列表存儲(chǔ)在開發(fā)數(shù)據(jù)庫(kù)中。
"%programfiles(x86)%\Red Gate\SQL Compare 13\sqlcompare" /Argfile:"cust1.xml" "%programfiles(x86)%\Red Gate\SQL Compare 13\sqlcompare" /Argfile:"cust2.xml" "%programfiles(x86)%\Red Gate\SQL Compare 13\sqlcompare" /Argfile:"cust3.xml"
每個(gè)argfile的內(nèi)容與shared.xml文件的內(nèi)容幾乎相同,唯一的區(qū)別是每個(gè)特定于客戶的argfile包含對(duì)該客戶的篩選器文件的引用(例如Cust1.scpf),該引用指示SQL Compare CL到使用以下表達(dá)式,僅檢測(cè)特定于該客戶的更改
(@NAME LIKE '%[_]cust1')
當(dāng)比較運(yùn)行時(shí)(例如對(duì)于Cust1),SQL Compare將生成一個(gè)部署腳本,該腳本將在代表Cust1安裝版本的主干分支中創(chuàng)建、修改或刪除任何* _cust1對(duì)象,因此它將與源代碼管理中的最新版本同步。在這種情況下,它將創(chuàng)建effective_rate_cust1存儲(chǔ)過(guò)程。
但是,對(duì)于每個(gè)客戶,SQL Compare的自動(dòng)生成的部署腳本不會(huì)將當(dāng)前的effective_rate同義詞(通過(guò)在階段1中運(yùn)行通用腳本創(chuàng)建)替換為引用有效_rate_cust1存儲(chǔ)過(guò)程的同義詞,因?yàn)檫@是Trunk或任何其他形式的同義詞。 每個(gè)主要版本(v241,v242等)的單個(gè)分支始終引用默認(rèn)實(shí)現(xiàn)。
因此,每次SQL Compare自動(dòng)生成特定于客戶的同步腳本時(shí),我們都需要對(duì)其進(jìn)行修改,以“重置”腳本中的任何同義詞,以便它引用相關(guān)操作的特定于客戶的實(shí)現(xiàn),或者如果不再需要自定義變體,則恢復(fù)為默認(rèn)操作。
我們不能為此使用標(biāo)準(zhǔn)的SQL比較部署后腳本,首先,因?yàn)橹苯优c源控件位置進(jìn)行比較時(shí),該工具當(dāng)前不支持使用它們。無(wú)論如何,由于我們簡(jiǎn)單的“每個(gè)版本一個(gè)分支”策略,我們無(wú)法動(dòng)態(tài)地為每個(gè)客戶生成一個(gè)部署后腳本,也無(wú)法更改每個(gè)腳本中的同義詞以引用正確的客戶實(shí)現(xiàn)。使其起作用的唯一方法是使用“每個(gè)版本的每個(gè)客戶一個(gè)分支”的更復(fù)雜的構(gòu)建方案,將每個(gè)分支腳本化到一個(gè)文件夾中,然后向其中添加一個(gè)后部署腳本,以為此重置同義詞。
但是,我們更喜歡使用更簡(jiǎn)單的源代碼控制方法,那么我們?cè)撛趺醋瞿兀?當(dāng)SQL Compare將特定于客戶的同步文件寫入我們選擇的目錄(由該客戶的XML argfile中的out參數(shù)指定)時(shí),我們有一個(gè)本地開發(fā)的工具可以打開該文件,并在自動(dòng)生成的代碼的末尾添加執(zhí)行的行,我們編寫的存儲(chǔ)過(guò)程稱為switch_synonyms_to_customer。 此過(guò)程接受組織的別名的參數(shù)(應(yīng)將同義詞綁定到該參數(shù)),然后遍歷所有SQL同義詞,將它們逐個(gè)刪除,然后使用同義詞引用的基礎(chǔ)對(duì)象的適當(dāng)名稱重新創(chuàng)建它們。 默認(rèn)值之一或?qū)S美蹋ㄈ绻囟蛻粜枰?/span>
因此,對(duì)于cust1:
EXEC altasoft.switch_synonyms_to_customer @alias = 'cust1'
對(duì)于cust2:
EXEC altasoft.switch_synonyms_to_customer @alias = 'cust2'
等等…
為每個(gè)客戶運(yùn)行部署
我們向每個(gè)客戶提供用于部署所有公共對(duì)象的常規(guī)部署腳本,如果需要,我們還為每個(gè)客戶提供為其定制邏輯提供的其他自定義部署腳本,該腳本還將正確重置所有同義詞。他們必須始終首先運(yùn)行常規(guī)腳本,只有完成后才運(yùn)行其自定義腳本。
結(jié)論
如果您正在為許多不同的客戶開發(fā)數(shù)據(jù)庫(kù)應(yīng)用程序,那么您的客戶的需求將開始出現(xiàn)分歧,并且單個(gè)部署無(wú)法滿足您的需求。畢竟,當(dāng)?shù)氐亩愂蘸头梢约安煌纳虡I(yè)慣例將決定客戶如何計(jì)算某些財(cái)務(wù)價(jià)值。
為了將所需邏輯中的所有變體僅提供給需要它的客戶,SQL Compare命令行可以完成所需工作的99%。它會(huì)生成一個(gè)通用同步腳本,以部署每個(gè)客戶所需的從一個(gè)版本到另一個(gè)版本的任何更改,然后為每個(gè)有“特殊”要求的客戶生成單獨(dú)的同步腳本文件。
通過(guò)使用同義詞表示每個(gè)必需的業(yè)務(wù)操作,并在每個(gè)特定于客戶的同步腳本的末尾“手動(dòng)”重置它們,以便它們始終引用此操作的正確實(shí)現(xiàn),我們避免了對(duì)調(diào)用者進(jìn)行任何更改碼。
在每個(gè)發(fā)行版中,都有可能為客戶創(chuàng)建了一些新邏輯,或者更新了現(xiàn)有的自定義邏輯或?qū)⑵鋭h除。如果某些操作不再需要自定義實(shí)現(xiàn),則將其刪除,因此客戶將返回該操作的默認(rèn)實(shí)現(xiàn)。
本教程內(nèi)容到這里就完結(jié)了,感興趣的朋友可以繼續(xù)關(guān)注我們網(wǎng)站!您可以下載SQL Compare試用版體驗(yàn)一下~
相關(guān)內(nèi)容推薦:
使用SQL Compare命令行從源代碼管理中進(jìn)行自定義部署(上)
SQL Compare教程:使用SQL Compare命令行從源代碼管理到數(shù)據(jù)庫(kù)
想要購(gòu)買SQL Compare正版授權(quán),或了解更多產(chǎn)品信息請(qǐng)點(diǎn)擊
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自: