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