翻譯|使用教程|編輯:莫成敏|2019-11-07 11:44:18.347|閱讀 560 次
概述:本文描述了自定義部署前和部署后腳本的工作方式,使用SQL Compare或SQL Change Automation進(jìn)行基于狀態(tài)的數(shù)據(jù)庫部署時(shí),以及如何使用它們(例如,向目標(biāo)數(shù)據(jù)庫添加版本號(hào))來指定其數(shù)據(jù)庫設(shè)置,或?qū)?shù)據(jù)填充到某些表中。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
SQL Compare是一款比較和同步SQL Server數(shù)據(jù)庫結(jié)構(gòu)的工具。現(xiàn)有超過150,000的數(shù)據(jù)庫管理員、開發(fā)人員和測試人員在使用它。當(dāng)測試本地?cái)?shù)據(jù)庫,暫存或激活遠(yuǎn)程服務(wù)器的數(shù)據(jù)庫時(shí),SQL Compare將分配數(shù)據(jù)庫的過程自動(dòng)化。
本文描述了自定義部署前和部署后腳本的工作方式,使用SQL Compare或SQL Change Automation進(jìn)行基于狀態(tài)的數(shù)據(jù)庫部署時(shí),以及如何使用它們(例如,向目標(biāo)數(shù)據(jù)庫添加版本號(hào))來指定其數(shù)據(jù)庫設(shè)置,或?qū)?shù)據(jù)填充到某些表中。
當(dāng)您使用所謂的“基于狀態(tài)”的數(shù)據(jù)庫部署方法時(shí),您需要設(shè)計(jì)一些其他的自定義腳本來解決一些棘手的部署問題。例如,如果您使用SQL Compare或SQL Change Automation(SCA)來將包含對(duì)象級(jí)腳本的腳本文件夾與保存數(shù)據(jù)的目標(biāo)數(shù)據(jù)庫同步,則可能需要一些自定義腳本來控制當(dāng)前版本與新版本之間數(shù)據(jù)移動(dòng)。
在執(zhí)行之前,SQL Compare和SCA都將這些腳本放在其生成的同步腳本的開頭或結(jié)尾。
自定義部署腳本有哪些優(yōu)點(diǎn)?
通常,當(dāng)您需要引入代碼來處理從一個(gè)數(shù)據(jù)庫版本到另一個(gè)版本的笨拙更改時(shí),將使用自定義部署腳本。例如,如果要更改已存儲(chǔ)有數(shù)據(jù)的數(shù)據(jù)庫版本中的表,則偶爾需要從SQL Compare中“奪取”來確保舊數(shù)據(jù)全部移至改進(jìn)版本中的正確位置。這種情況經(jīng)常會(huì)發(fā)生在表重命名或表拆分時(shí)。有時(shí),包含非原子數(shù)據(jù)的單個(gè)列(例如,逗號(hào)分隔的列表、XML或JSON)將需要分配到標(biāo)準(zhǔn)化列中。
您可能還遇到依賴關(guān)系、更改數(shù)據(jù)庫屬性、添加計(jì)劃任務(wù)、添加數(shù)據(jù)庫版本號(hào)等問題。在其他時(shí)候,您可能還需要更改數(shù)據(jù)庫級(jí)別的設(shè)置、管理角色成員身份、檢查是否存在正確的靜態(tài)數(shù)據(jù),或者創(chuàng)建或更改SQL Server代理作業(yè)。所有這些事項(xiàng)都可以通過自定義部署腳本處理。
從腳本目錄部署
SQL Compare比較源和目標(biāo)兩個(gè)數(shù)據(jù)庫,并自動(dòng)生成一個(gè)同步腳本,該腳本將修改目標(biāo)架構(gòu),使其與源架構(gòu)匹配。使用腳本目錄作為源時(shí),SQL Compare允許您將額外的SQL腳本附加到它生成的同步腳本的開頭或結(jié)尾。
如果源是從版本控制系統(tǒng)獲取的腳本目錄,則SQL Compare允許部署前和部署后腳本,但每個(gè)腳本只能有一個(gè)。無論是UI和命令行,SQL Compare都允許使用13.4.7版本的版本,也可以使用SQL Change Automation版本3.0.4的版本。
腳本必須包含在名為Custom Scripts的目錄中,該目錄位于Post-Deployment或Pre-Deployment的子目錄中。
部署后腳本和部署前腳本都在運(yùn)行腳本的自動(dòng)生成部分的事務(wù)之外,因此您需要在這些自定義部署腳本中添加自己的事務(wù)處理并管理所有回滾。
每個(gè)腳本必須遵循某些簡單的約定。 該腳本不會(huì)因錯(cuò)誤而中止執(zhí)行,因此它必須捕獲每個(gè)錯(cuò)誤并報(bào)告該錯(cuò)誤,同時(shí)還將NOEXEC設(shè)置為ON(如果是“致命”錯(cuò)誤)。 如果在部署后腳本之前發(fā)生錯(cuò)誤,則NOEXEC將打開。 因此,它將不會(huì)執(zhí)行。 切勿在部署后腳本中使用NOEXEC OFF命令,因?yàn)橥侥_本使用NOEXEC ON開關(guān)在發(fā)生任何錯(cuò)誤后中止處理。 如果您在發(fā)生錯(cuò)誤后無意間重新啟用了執(zhí)行,則將發(fā)生錯(cuò)誤的事情
腳本的每個(gè)部分在開始時(shí)都應(yīng)該有一個(gè)PRINT語句來描述其功能,這樣,如果出現(xiàn)錯(cuò)誤,則很明顯是造成回滾的原因。
每個(gè)腳本都必須是可重新運(yùn)行且冪等的。它必須能夠在所有預(yù)期的目標(biāo)環(huán)境中運(yùn)行,并且必須支持整個(gè)數(shù)據(jù)庫環(huán)境中數(shù)據(jù)庫排序規(guī)則的任何可能差異。
部署前和部署后腳本如何工作
這些自定義腳本的內(nèi)容不是構(gòu)建的一部分,因?yàn)樗鼈冎钡奖容^完成后才執(zhí)行,因此它們對(duì)SQL Compare自動(dòng)生成的同步腳本沒有影響。在生成同步腳本之后但在執(zhí)行之前,使用預(yù)部署腳本來更改目標(biāo)數(shù)據(jù)庫。執(zhí)行同步腳本后,將使用部署后腳本來更改目標(biāo)。
例如,如果您在預(yù)部署子目錄中放置了一個(gè)包含創(chuàng)建表的自定義腳本,則該表將不包含在比較中。SQL Compare運(yùn)行比較,生成同步腳本,在目標(biāo)上執(zhí)行部署前腳本,創(chuàng)建新表,然后執(zhí)行同步腳本。另一方面,如果將相同的腳本放在“自定義腳本”目錄的“部署后”子目錄中,則SQL Compare將在運(yùn)行其同步腳本后創(chuàng)建新表。
SQL Compare中沒有其他方法可以添加遷移邏輯。如果需要在完成比較之前更改目標(biāo),則必須在運(yùn)行SQL Compare之前在單獨(dú)的腳本中進(jìn)行操作。
例如,如果您需要從目標(biāo)數(shù)據(jù)庫中的表中復(fù)制數(shù)據(jù)(將對(duì)其進(jìn)行更改)并將其保存到臨時(shí)表中,則部署前腳本會(huì)很有用。然后可以在同步腳本中更改表,最后,可以在部署后腳本中將數(shù)據(jù)重新插入到新表中。您可能還需要使用部署后腳本來確保表中存在某些引用或靜態(tài)數(shù)據(jù)。
SQL Compare在比較中不考慮服務(wù)器范圍的對(duì)象,因此,如果需要在源和目標(biāo)之間同步代理作業(yè),則可以在部署前或部署后腳本中進(jìn)行同步。其他任務(wù)(例如,檢查數(shù)據(jù)庫設(shè)置是否正確)必須使用部署前腳本,因?yàn)樗鼈兛梢暂p松更改后續(xù)腳本的執(zhí)行方式。例如,如果排序規(guī)則不區(qū)分大小寫,而數(shù)據(jù)庫區(qū)分大小寫,則同步將無法進(jìn)行。
部署后腳本可用于應(yīng)用創(chuàng)建數(shù)據(jù)庫版本的特定變體所需的更改。例如,如果您有一個(gè)工資單數(shù)據(jù)庫的變體根據(jù)立法區(qū)域,則可以根據(jù)所需的立法區(qū)域進(jìn)行切換。
您可能需要在主干中保留數(shù)據(jù)庫同一版本的多個(gè)變體,使用條件開關(guān)來生成正確的變體(例如,任何會(huì)計(jì)程序包可能每個(gè)稅區(qū)都有變體)。盡管可以有條件地運(yùn)行一個(gè)CREATE或多個(gè)ALTER腳本,但這會(huì)使源代碼控制變得過于復(fù)雜,并使從腳本目錄進(jìn)行的同步成為雷區(qū)。
我建議,最佳做法是在版本中包含所有代碼,并使用功能切換或功能開關(guān)(例如表中的值或擴(kuò)展屬性)來實(shí)現(xiàn)正確的邏輯。僅可以通過簡單的邏輯(例如檢查目標(biāo)數(shù)據(jù)庫的名稱并相應(yīng)地進(jìn)行切換)在部署后腳本中設(shè)置此屬性。功能或擴(kuò)展屬性中保留的“軟”數(shù)據(jù)庫開關(guān)或切換允許使用同一部署測試所有變體。
Quirks
使用部署前和部署后腳本時(shí),需要考慮一些限制。
不支持使用SQLCMD語法和變量,除非您在SQL Compare之外,使用SQLCMD或在SQLCMD模式下使用SSMS分別執(zhí)行同步腳本。
如果您選擇修改現(xiàn)有對(duì)象作為這些自定義腳本的一部分,則需要確保SQL Compare引擎不理會(huì)它們。您將需要在主腳本目錄中(而不是在“自定義腳本”目錄中)具有新版本的對(duì)象源代碼,因此您需要使用SQL Compare過濾器或/Exclude開關(guān)來告訴SQL Compare也不要?jiǎng)?chuàng)建或更改它們。以防止在比較中包含這些對(duì)象。
如果SQL Compare在源和目標(biāo)之間進(jìn)行比較并發(fā)現(xiàn)它們相同,則它將不會(huì)運(yùn)行后腳本和前腳本,因?yàn)閷]有附加它們的同步腳本。
除非對(duì)這些腳本進(jìn)行了徹底的測試,否則只有在執(zhí)行部署腳本后才會(huì)發(fā)現(xiàn)錯(cuò)誤,然后它們才會(huì)破壞構(gòu)建,從而可能導(dǎo)致問題。在使用之前,請(qǐng)花一些時(shí)間對(duì)其進(jìn)行徹底測試。
本文是該教程前半部分內(nèi)容,后半部分內(nèi)容請(qǐng)點(diǎn)擊下方鏈接!感興趣的朋友可以繼續(xù)關(guān)注我們了解更多文章資訊,或者下載SQL Compare試用版進(jìn)行評(píng)估~
相關(guān)內(nèi)容推薦:
將自定義部署腳本與SQL Compare或SQL Change Automation一起使用(下)
想要購買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)載自: