翻譯|使用教程|編輯:莫成敏|2019-11-07 11:56:23.060|閱讀 419 次
概述:本文描述了自定義部署前和部署后腳本的工作方式,使用SQL Compare或SQL Change Automation進(jìn)行基于狀態(tài)的數(shù)據(jù)庫(kù)部署時(shí),以及如何使用它們(例如,向目標(biāo)數(shù)據(jù)庫(kù)添加版本號(hào))來(lái)指定其數(shù)據(jù)庫(kù)設(shè)置,或?qū)?shù)據(jù)填充到某些表中。
# 界面/圖表報(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或SQL Change Automation一起使用
本文描述了自定義部署前和部署后腳本的工作方式,使用SQL Compare或SQL Change Automation進(jìn)行基于狀態(tài)的數(shù)據(jù)庫(kù)部署時(shí),以及如何使用它們(例如,向目標(biāo)數(shù)據(jù)庫(kù)添加版本號(hào))來(lái)指定其數(shù)據(jù)庫(kù)設(shè)置,或?qū)?shù)據(jù)填充到某些表中。內(nèi)容緊接“將自定義部署腳本與SQL Compare或SQL Change Automation一起使用(下)”哦,您可以點(diǎn)擊查看~
源代碼控制和自定義腳本
部署后和部署前腳本幾乎都應(yīng)該保留在源代碼管理中。無(wú)論它們創(chuàng)建或更改什么對(duì)象,狀態(tài)都必須處于源代碼控制中。通常,對(duì)于表拆分之類的更改,只需添加一個(gè)SQL Compare過(guò)濾器或/exclude切換為告訴SQL Compare在比較中不包括受影響的對(duì)象,因?yàn)樗窃陔S附的部署后腳本中完成的。這意味著源代碼控制可以具有用于更改對(duì)象的SQL DDL代碼,而它們的存在不會(huì)干擾復(fù)雜的數(shù)據(jù)拆分。如前所述,在允許同步腳本進(jìn)行除對(duì)象以外的其余所有更改之前,完全有可能使用預(yù)部署腳本將要更改的表中的現(xiàn)有數(shù)據(jù)從目標(biāo)表中保存到目標(biāo)數(shù)據(jù)庫(kù)中。您指定要排除在外;然后匹配的部署后腳本可以讀取臨時(shí)表并將數(shù)據(jù)放置在正確的位置。
兩種類型的自定義腳本(部署前和部署后)都應(yīng)特定于版本。但是,由于它們是冪等的,因此即使它們意外重新運(yùn)行,它們也通常不會(huì)傷害任何東西。腳本文件夾將僅反映一個(gè)版本,因此應(yīng)易于為該版本提供正確的自定義腳本。
不一定要保證數(shù)據(jù)庫(kù)部署的目標(biāo)。如果您不維護(hù)實(shí)時(shí)數(shù)據(jù)庫(kù)的版本號(hào),則需要確保自定義腳本將與“瘋狂”的所有可能目標(biāo)版本一起使用。
例子
這些不應(yīng)該按原樣運(yùn)行; 例如,您需要填寫數(shù)據(jù)庫(kù)的名稱和版本號(hào),或者根據(jù)需要調(diào)整信息。 數(shù)據(jù)庫(kù)設(shè)置示例可能會(huì)對(duì)運(yùn)行它的不幸數(shù)據(jù)庫(kù)產(chǎn)生微妙而廣泛的影響。 它們也不代表如何執(zhí)行這些任務(wù)的一般建議,因?yàn)槟那闆r可能會(huì)有所不同。例如,“存有數(shù)據(jù)的表”示例將很好,直到您有成千上萬(wàn)的行,此時(shí)您使用大容量插入效果更好。 這些示例僅是為了說(shuō)明,以向您展示可能性
向表中存儲(chǔ)數(shù)據(jù)
想象一下,您需要構(gòu)建一個(gè)過(guò)時(shí)的PUBS數(shù)據(jù)庫(kù)版本,包括所有數(shù)據(jù)。該腳本必須位于“部署后”目錄中。這是確保dbo.publishers表僅包含原始數(shù)據(jù)的示例。
PRINT 'Ensuring that the original PUBS test data is there' BEGIN TRY MERGE INTO dbo.publishers AS target USING (VALUES ( '0736', 'New Moon Books', 'Boston', 'MA', 'USA' ), ( '0877', 'Binnet & Hardley', 'Washington', 'DC', 'USA' ), ( '1389', 'Algodata Infosystems', 'Berkeley', 'CA', 'USA' ), ( '1622', 'Five Lakes Publishing', 'Chicago', 'IL', 'USA' ), ( '1756', 'Ramona Publishers', 'Dallas', 'TX', 'USA' ), ( '9901', 'GGG&G', 'M?nchen', NULL, 'Germany' ), ( '9952', 'Scootney Books', 'New York', 'NY', 'USA' ), ( '9999', 'Lucerne Publishing', 'Paris', NULL, 'France' ) )source(pub_id,pub_name,city,[state],country) ON target.pub_id = source.pub_id WHEN NOT MATCHED BY TARGET THEN INSERT ( pub_id,pub_name,city,[state],country ) VALUES ( pub_id,pub_name,city,[state],country ) WHEN NOT MATCHED BY SOURCE THEN DELETE; END try BEGIN CATCH DECLARE @msg nvarchar(max)=Error_Message(), @severity int = ERROR_SEVERITY(), @State int = ERROR_State() RAISERROR(@msg, @severity, @state); SET NOEXEC ON END CATCH
數(shù)據(jù)庫(kù)設(shè)置
這些必須在部署前腳本中執(zhí)行。為了使數(shù)據(jù)庫(kù)按預(yù)期運(yùn)行,需要某些數(shù)據(jù)庫(kù)屬性設(shè)置。通常最好在部署時(shí)檢查這些設(shè)置,因?yàn)樗鼈冇袝r(shí)會(huì)產(chǎn)生細(xì)微的錯(cuò)誤。排序規(guī)則、恢復(fù)模型和兼容性級(jí)別是顯而易見的,但是還需要檢查其他幾項(xiàng),例如自動(dòng)更新統(tǒng)計(jì)信息和自動(dòng)創(chuàng)建統(tǒng)計(jì)信息。當(dāng)然,您需要確定數(shù)據(jù)庫(kù)的正確設(shè)置。這些只是DBA可能建議的設(shè)置示例。
/* To run this Requires having ALTER permission on the target database. */
PRINT 'Ensuring that the settings are right for this particular database.
DECLARE @AutoCreateStatistics INT,@AutoUpdateStatistics INT,
@ReadCommittedSnapshot INT,@AutoUpdateStatisticsAsynchronously INT,
@recovery_model_desc nvarchar(120),@compatibility_level int
SELECT @AutoCreateStatistics=is_auto_create_stats_on,
@AutoUpdateStatistics=is_auto_update_stats_on,
@AutoUpdateStatisticsAsynchronously=is_auto_update_stats_async_on,
@ReadCommittedSnapshot=is_read_committed_snapshot_on,
@recovery_model_desc=recovery_model_desc,
@compatibility_level=[compatibility_level]
FROM sys.databases
WHERE name='pubs'
IF @AutoCreateStatistics=0
ALTER DATABASE current
SET AUTO_CREATE_STATISTICS ON
DECLARE @AnyErrors INT =@@error
IF @AutoUpdateStatistics=0
ALTER DATABASE current
SET AUTO_UPDATE_STATISTICS ON
SELECT @AnyErrors=@AnyErrors+@@Error
IF @AutoUpdateStatisticsAsynchronously=1
ALTER DATABASE current
SET AUTO_UPDATE_STATISTICS_ASYNC OFF
SELECT @AnyErrors=@AnyErrors+@@Error
if @ReadCommittedSnapshot=0
ALTER DATABASE current
SET READ_COMMITTED_SNAPSHOT ON WITH rollback immediate
SELECT @AnyErrors=@AnyErrors+@@Error
if @recovery_model_desc<>'SIMPLE'
ALTER DATABASE CURRENT SET RECOVERY SIMPLE
SELECT @AnyErrors=@AnyErrors+@@Error
/* normally you'd want it at your current product version
but you might, as in this case, need something different
check product version with
SELECT SERVERPROPERTY('ProductVersion');
*/
IF @compatibility_level<>100 --Warning this is specially for old PUBS!
ALTER DATABASE PUBS --a bad idea anywhere else
SET COMPATIBILITY_LEVEL = 100
SELECT @AnyErrors=@AnyErrors+@@Error
--See //docs.microsoft.com/en-us/sql/t-sql/statements/alter-database-transact-sql?view=sql-server-ver15 before doing this
IF NOT EXISTS (
SELECT 1 FROM sys.databases
WHERE name= Db_Name()
AND collation_name='SQL_Latin1_General_CP1_CI_AI')
ALTER DATABASE CURRENT COLLATE SQL_Latin1_General_CP1_CI_AI
SELECT @AnyErrors=@AnyErrors+@@Error
IF @AnyErrors>0
SET NOEXEC ON添加版本信息
這可以作為部署前腳本或部署后腳本來(lái)完成。此示例腳本僅將版本號(hào)和說(shuō)明作為JSON字符串插入。本文直接將數(shù)據(jù)與SQL Server數(shù)據(jù)庫(kù)對(duì)象相關(guān)聯(lián),其中包含該代碼的擴(kuò)展版本,該版本可以跟蹤版本以及何時(shí)應(yīng)用版本。
PRINT N'Adding a version number' GO DECLARE @DatabaseInfo NVARCHAR(3750) SELECT @DatabaseInfo = ( SELECT Db_Name() AS "Name", '2.4.01 (Change This to your version)' AS "Version", 'You will need to edit this string' AS "Description", GetDate() AS "Modified", SUser_Name() AS "by" FOR JSON PATH ); BEGIN TRY IF not EXISTS (SELECT name, value FROM fn_listextendedproperty( N'Database_Info',default, default, default, default, default, default) ) EXEC sys.sp_addextendedproperty @name=N'Database_Info', @value=@DatabaseInfo ELSE EXEC sys.sp_Updateextendedproperty @name=N'Database_Info', @value=@DatabaseInfo END TRY BEGIN CATCH DECLARE @msg nvarchar(max)=Error_Message(), @severity int = ERROR_SEVERITY(), @State int = ERROR_State() RAISERROR(@msg, @severity, @state); SET NOEXEC ON END CATCH
結(jié)論
部署前或部署后腳本使我們能夠克服開發(fā)團(tuán)隊(duì)所面臨的大多數(shù)問(wèn)題,這些開發(fā)團(tuán)隊(duì)正在通過(guò)SQL Compare在腳本目錄中部署數(shù)據(jù)庫(kù)代碼,同時(shí)在版本控制中保留了源代碼的唯一真實(shí)性。
本教程內(nèi)容到這里就結(jié)束了,喜歡的朋友可以繼續(xù)關(guān)注我們后續(xù)內(nèi)容哦~您也可以下載SQL Compare試用版體驗(yàn)一下~
相關(guān)內(nèi)容推薦:
將自定義部署腳本與SQL Compare或SQL Change Automation一起使用(上)
想要購(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)載自: