数据库安装包和升级包脚本工具RedGate有什么用?

分类:编程技术 时间:2024-02-20 15:38 浏览:0 评论:0
0
本文主要讲解“数据库安装包和升级包脚本工具RedGate有什么用”。文章中的讲解内容简单明了,易学易懂。请大家按照小编的思路慢慢深入,一起学习、理解。学习《如何使用数据库安装包和升级包脚本工具RedGate》!

在产品开发和版本更新过程中,数据库的结构不可避免地会发生变化。为了最大限度地减少升级过程中的工作量,设计良好的数据库升级方法非常重要。在设计数据库安装包时,不仅要考虑新安装时如何生成默认数据,还要考虑从旧版本升级时如何迁移旧数据(如果需要)。

安装包基本上可以分为三部分:Pre-script、数据库安装或升级以及Post-script。

1.数据库安装或升级

首先,我们使用Red Gate工具。该工具会自动比较现有数据库和目标数据库的结构差异,并自动生成升级脚本(实际上是执行一系列SQL语句)。这是一个非常好的工具,推荐使用(好像要花钱),可以减少很多工作量。

如果Red Gate发现目标表在旧版本数据库中不存在,它会自动创建表并设置主键、外键等约束。这没什么好说的。

如果目标表已存在,则更新原表。特别注意要更改的表的结构如何变化。例如:

我们原本有一个 UserParameter 表,其结构如下:

现在,我们要添加一个 ParameterType 字段,与 UserId 形成联合主键字段:

p>


此时,如果旧版本数据库有数据,在升级过程中添加新字段后,会因为ParameterType为空而导致表结构修改失败,安装包将错误。

解决方案是为此字段添加默认值。一般做法是在数据库项目的Schema Objects – Tables – Constraints下添加Default Constraint约束:

复制代码代码如下:


更改表 [TMS].[UserParameters]
添加约束 [DF_UserParameters_Type]
  默认 N'SU'
FOR [ParameterType]

2. Pre-script 和 Post-script

概述 一般来说,大多数数据表的结构变化都可以由 RedGate 自动完成。我们要做的就是注意设置默认值。但还有其他情况需要编写自己的脚本,这里有一些示例。


1.默认data
默认数据是在数据库创建后添加的。我们可以将名为 DefaultData.sql 的脚本添加到 Post-script 中。示例如下:

复制代码 代码如下:


SET NOCOUNT ON
SET XACT_ABORT ON
BEGIN TRANSACTION
--FloorAlertOrder 的新默认值
如果不存在(从 TMS.[FloorAlertOrder] 中选择 1,其中 [ModeId] = 1 且 [TypeId] = 7)
INSERT INTO [TMS].[FloorAlertOrder] ([TypeId], [Ordinal], [ModeId]) VALUES (7, 10, 1)

-- TMS.User

如果不存在(从 [TMS].[User] 中选择 1,其中 XRef = '主机')
INSERT INTO [TMS].[User]
([Active]
,[XRef ]
,[姓氏]
 ​ ,[名字]
 ​ ,[用户名]
 ​ ,[创建时间]
 ​ ,[经销商]
 ​,[CasinoHost]
 ​,[域名]
          , [CMSUserName])
       值
                                                                                                              ,'主机'
 ,,GETUTCDATE()
,, 0
, ,0
,,'Host'
,'Host')
COMMIT TRANSACTION
GO

此脚本唯一需要考虑的是数据库不一定是为空,可能已经升级了,所以需要判断是否有原始数据。另外,在编写这些脚本时,最好将它们放在事务中。当安装失败时,可以撤销未提交的数据,以便用户在排除问题后可以直接重新安装。

2.某个字段发生变化

例如,我们有一个Rating表,其中包含一个TerminalId字段。原来是VARCHAR类型,记录机器。姓名。现在我们的新版本将该字段的类型更改为int类型,并添加了与Terminal表相关的外键约束。针对这种情况,我们需要自己写一个脚本。

首先,一定不能放在Post-script中。在安装数据库的过程中,安装程序会尝试改变field 改为 int 类型并添加外键约束。如果数据库本身有数据,则转换为int会失败或者外键约束不成立。

为此,我们可以首先查看 Terminal 表中的数据并在 Pre-script 中更新它:

复制代码代码如下:


BEGIN TRANSACTION
BEGIN TRY

IF EXISTS(从 INFORMATION_SCHEMA.COLUMNS 中选择 1,其中 TABLE_NAME = 'Rating' 和 COLUMN_NAME = 'TerminalId' 且 DATA_TYPE = 'varchar')
BEGIN

DECLARE @defaultTerminalId NVARCHAR(64) = (SELECT TOP 1 TerminalId FROM TMS.Terminal ORDER BY TerminalId ASC)

更新 r
SET r.TerminalId = ISNULL(t.TerminalId, @defaultTerminalId)
FROM TMS.Rating r
LEFT JOIN TMS.Terminal t ON r。 TerminalId = t.NAME

END
提交事务
END TRY

开始捕获
IF @@TRANCOUNT > 0 ROLLBACK
END CATCH

GO


首先,我们还得考虑多种情​​况:如果是从旧版本升级,那么TerminalId字段的类型是varchar。此时就需要进行转换。如果不是(比如全新安装;或者之前的版本已经转成int了,这个Pre-script在下一个版本中依然会执行,所以这种情况也要考虑到),那么就转换一下。

脚本中直接将查询到的Terminal表的TerminalId更新到Rating表中,如果找不到则替换为默认值(int可以转为varchar,如果宽度足够的话) ;另外,该列也可以为NULL值)。这样,执行完这个Pre-script就已经是目标值了,剩下的列类型转换和外键约束就可以交给Red Gate了。

UPDATE 语句还可以连接其他表。这一点很有趣。你可以学习一下这个说法。

3、删除某张表

如果不再需要某个表,Red Gate 会直接将其删除。但如果仍然需要数据(例如,将其保存在另一个系统中),则必须使用 Pre-script 将数据保存在其他地方。否则,安装后,在执行 Post-script 之前,表和数据将消失。 。

例如,我们有一个 UserCard 表。在新版本中,数据由另一个系统处理。为此,我们需要将数据传输到另一个系统。

您可以指定 Red Gate 升级的 Schema 类型。比如我们只关心TMS下的所有表,直接忽略其他schema下的表。利用这一点,您可以在Pre-script中将这些数据移动到dbo下:

复制代码代码如下:


-- 备份UserCard数据,以便我们在安装TMS时将其传输到SBDB

BEGIN TRANSACTION
BEGIN TRY

IF EXISTS(SELECT *来自 INFORMATION_SCHEMA .TABLES,其中 TABLE_NAME = 'TempUserCard'AND TABLE_SCHEMA = 'dbo')
删除表 [dbo].[TempUserCard]

创建表 [dbo].[TempUserCard] (UserCardId BIGINT NOT NULL , UserId BIGINT NOT NULL, CardInfo NVARCHAR (256) NOT NULL)

如果存在(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'UserCard' AND TABLE_SCHEMA = 'TMS')
BEGIN

INSERT INTO [dbo].[TempUserCard]
从 [TMS].[UserCard] 选择 UserCardId、UserId、CardInfo

END

提交交易
END TRY

BEGIN CATCH
IF @@TRANCOUNT > 0 ROLLBACK
END CATCH

GO

在此这样,数据库安装完成后,数据就会在dbo.TempUserCard表中。这时,这些表就可以在其他组件的安装程序中,或者Post-script,或者其他系统中调用。

使用这样的设计应该可以应对大部分情况。当然,我们在设计数据库的结构时应该尽量考虑周全,避免频繁修改。数据表的结构发生变化,导致 Pre-script 和 Post-script 过多。混乱。当我们确认有些脚本没有被使用时,我们也可以将其删除。

感谢您的阅读。以上就是《数据库安装包和升级包脚本工具RedGate有什么用》的内容。经过文章的学习,相信大家对数据库安装包已经很熟悉了。对升级包脚本工具RedGate如何使用的问题有了更深入的了解。具体用法需要在实践中验证。在此,小编将为大家推送更多相关知识点的文章,欢迎关注!

1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > 数据库安装包和升级包脚本工具RedGate有什么用?

用户评论