将自定义部署脚本与SQL Compare或SQL Change Automation一起使用(上)

翻译|使用教程|编辑:莫成敏|2019-11-07 11:44:18.347|阅读 91 次

概述:本文描述了自定义部署前和部署后脚本的工作方式,使用SQL Compare或SQL Change Automation进行基于状态的数据库部署时,以及如何使用它们(例如,向目标数据库添加版本号)来指定其数据库设置,或将数据填充到某些表中。

# 您正在找协同办公软件吗?点击这里站长给您推荐 #

SQL Compare是一款比较和同步SQL Server数据库结构的工具。现有超过150,000的数据库管理员、开发人员和测试人员在使用它。当测试本地数据库,暂存或激活远程服务器的数据库时,SQL Compare将分配数据库的过程自动化。

点击下载SQL Compare免费版

本文描述了自定义部署前和部署后脚本的工作方式,使用SQL Compare或SQL Change Automation进行基于状态的数据库部署时,以及如何使用它们(例如,向目标数据库添加版本号)来指定其数据库设置,或将数据填充到某些表中。

当您使用所谓的“基于状态”的数据库部署方法时,您需要设计一些其他的自定义脚本来解决一些棘手的部署问题。例如,如果您使用SQL Compare或SQL Change Automation(SCA)来将包含对象级脚本的脚本文件夹与保存数据的目标数据库同步,则可能需要一些自定义脚本来控制当前版本与新版本之间数据移动。

在执行之前,SQL Compare和SCA都将这些脚本放在其生成的同步脚本的开头或结尾。

自定义部署脚本有哪些优点?

通常,当您需要引入代码来处理从一个数据库版本到另一个版本的笨拙更改时,将使用自定义部署脚本。例如,如果要更改已存储有数据的数据库版本中的表,则偶尔需要从SQL Compare中“夺取”来确保旧数据全部移至改进版本中的正确位置。这种情况经常会发生在表重命名或表拆分时。有时,包含非原子数据的单个列(例如,逗号分隔的列表、XML或JSON)将需要分配到标准化列中。

您可能还遇到依赖关系、更改数据库属性、添加计划任务、添加数据库版本号等问题。在其他时候,您可能还需要更改数据库级别的设置、管理角色成员身份、检查是否存在正确的静态数据,或者创建或更改SQL Server代理作业。所有这些事项都可以通过自定义部署脚本处理。

从脚本目录部署

SQL Compare比较源和目标两个数据库,并自动生成一个同步脚本,该脚本将修改目标架构,使其与源架构匹配。使用脚本目录作为源时,SQL Compare允许您将额外的SQL脚本附加到它生成的同步脚本的开头或结尾。

如果源是从版本控制系统获取的脚本目录,则SQL Compare允许部署前和部署后脚本,但每个脚本只能有一个。无论是UI和命令行,SQL Compare都允许使用13.4.7版本的版本,也可以使用SQL Change Automation版本3.0.4的版本。

脚本必须包含在名为Custom Scripts的目录中,该目录位于Post-DeploymentPre-Deployment的子目录中。

将自定义部署脚本与SQL Compare或SQL Change Automation一起使用(上)

部署后脚本和部署前脚本都在运行脚本的自动生成部分的事务之外,因此您需要在这些自定义部署脚本中添加自己的事务处理并管理所有回滚。

每个脚本必须遵循某些简单的约定。 该脚本不会因错误而中止执行,因此它必须捕获每个错误并报告该错误,同时还将NOEXEC设置为ON(如果是“致命”错误)。 如果在部署后脚本之前发生错误,则NOEXEC将打开。 因此,它将不会执行。 切勿在部署后脚本中使用NOEXEC OFF命令,因为同步脚本使用NOEXEC ON开关在发生任何错误后中止处理。 如果您在发生错误后无意间重新启用了执行,则将发生错误的事情

脚本的每个部分在开始时都应该有一个PRINT语句来描述其功能,这样,如果出现错误,则很明显是造成回滚的原因。

每个脚本都必须是可重新运行且幂等的。它必须能够在所有预期的目标环境中运行,并且必须支持整个数据库环境中数据库排序规则的任何可能差异。

部署前和部署后脚本如何工作

这些自定义脚本的内容不是构建的一部分,因为它们直到比较完成后才执行,因此它们对SQL Compare自动生成的同步脚本没有影响。在生成同步脚本之后但在执行之前,使用预部署脚本来更改目标数据库。执行同步脚本后,将使用部署后脚本来更改目标。

例如,如果您在预部署子目录中放置了一个包含创建表的自定义脚本,则该表将不包含在比较中。SQL Compare运行比较,生成同步脚本,在目标上执行部署前脚本,创建新表,然后执行同步脚本。另一方面,如果将相同的脚本放在“自定义脚本”目录的“部署后”子目录中,则SQL Compare将在运行其同步脚本后创建新表。

SQL Compare中没有其他方法可以添加迁移逻辑。如果需要在完成比较之前更改目标,则必须在运行SQL Compare之前在单独的脚本中进行操作。

例如,如果您需要从目标数据库中的表中复制数据(将对其进行更改)并将其保存到临时表中,则部署前脚本会很有用。然后可以在同步脚本中更改表,最后,可以在部署后脚本中将数据重新插入到新表中。您可能还需要使用部署后脚本来确保表中存在某些引用或静态数据。

SQL Compare在比较中不考虑服务器范围的对象,因此,如果需要在源和目标之间同步代理作业,则可以在部署前或部署后脚本中进行同步。其他任务(例如,检查数据库设置是否正确)必须使用部署前脚本,因为它们可以轻松更改后续脚本的执行方式。例如,如果排序规则不区分大小写,而数据库区分大小写,则同步将无法进行。

部署后脚本可用于应用创建数据库版本的特定变体所需的更改。例如,如果您有一个工资单数据库的变体根据立法区域,则可以根据所需的立法区域进行切换。

您可能需要在主干中保留数据库同一版本的多个变体,使用条件开关来生成正确的变体(例如,任何会计程序包可能每个税区都有变体)。尽管可以有条件地运行一个CREATE或多个ALTER脚本,但这会使源代码控制变得过于复杂,并使从脚本目录进行的同步成为雷区。

我建议,最佳做法是在版本中包含所有代码,并使用功能切换或功能开关(例如表中的值或扩展属性)来实现正确的逻辑。仅可以通过简单的逻辑(例如检查目标数据库的名称并相应地进行切换)在部署后脚本中设置此属性。功能或扩展属性中保留的“软”数据库开关或切换允许使用同一部署测试所有变体。

Quirks

使用部署前和部署后脚本时,需要考虑一些限制。

不支持使用SQLCMD语法和变量,除非您在SQL Compare之外,使用SQLCMD或在SQLCMD模式下使用SSMS分别执行同步脚本。

如果您选择修改现有对象作为这些自定义脚本的一部分,则需要确保SQL Compare引擎不理会它们。您将需要在主脚本目录中(而不是在“自定义脚本”目录中)具有新版本的对象源代码,因此您需要使用SQL Compare过滤器或/Exclude开关来告诉SQL Compare也不要创建或更改它们。以防止在比较中包含这些对象。

如果SQL Compare在源和目标之间进行比较并发现它们相同,则它将不会运行后脚本和前脚本,因为将没有附加它们的同步脚本。

除非对这些脚本进行了彻底的测试,否则只有在执行部署脚本后才会发现错误,然后它们才会破坏构建,从而可能导致问题。在使用之前,请花一些时间对其进行彻底测试。

本文是该教程前半部分内容,后半部分内容请点击下方链接!感兴趣的朋友可以继续关注我们了解更多文章资讯,或者下载SQL Compare试用版进行评估~

相关内容推荐:

SmartBear资源专题>>>

将自定义部署脚本与SQL Compare或SQL Change Automation一起使用(下)


想要购买SQL Compare正版授权,或了解更多产品信息请点击“咨询在线客服”

850×682.png



标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,尊重他人劳动成果

文章转载自:Red Gate https://www.red-gate.com/hub/product-learning/sql-compare/using-custom-deployment-scripts-with-sql-compare-or-sql-change-automation?product=sql-compare

登录 慧都网发表评论


暂无评论...

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
相关厂商
相关产品
SQL Compare

SQL Compar是一款比较和同步SQL Server数据库结构的工具。

在线
客服
咨询
电话
400-700-1020
在线
QQ
购物车 反馈 返回
顶部
在线客服系统
live chat