在单个操作中重新格式化整个数据库只需简单3步! - 日记屋
在单个操作中重新格式化整个数据库只需简单3步!
发布时间:

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

从另一个团队继承数据库?在格式化SQL的方式上更改了团队策略?当您开发它时,什么阻止您很好地格式化整个数据库的代码?手动的过程可能需要比预期更长的时间。本篇文章演示了使用SQL Compare和SQL Prompt在单个操作中重新格式化整个数据库的简单3步方法。

首先,为开发数据库生成最新的构建脚本,包括表、代码模块等等。您可以使用SQL Prompt根据团队的标准重新格式化整个构建脚本。到目前为止一切都很简单,但接下来呢?

下一个任务是将这些格式更改保存到开发数据库中。您需要设计一个迁移脚本,该脚本在执行时会将每个代码模块、作为视图的对象、表值函数、标量函数、触发器和过程,以应用新的代码格式。这样,这些例程的新来源将保留在数据库中。但是,由于复杂的对象间引用,这可能不像通过构建脚本并将CREATE语句更改为ALTER那么简单。当您尝试运行这些ALTER命令时,您可能会遇到麻烦。

例如,除了在视图、另一个函数或过程中引用之外,函数也可以绑定到表列上的计算列、默认约束或检查约束。如果您尝试以这种方式更改正在使用的函数,您将收到错误:

Cannot ALTER '<name of referenced object>' because it is being referenced by object '<Name of referencing object>'.

为避免这种情况,您必须在更改函数之前删除引用和约束,然后替换它们。如果一个函数被引用很多,这使得改变函数相当棘手。此外,如果WITH SCHEMABINDING正在使用,将强制执行依赖项。这意味着在更改之前必须更改所有下游例程以删除模式绑定。总而言之,它可能会变得复杂。

成功执行了迁移脚本之后,您还需要在源代码管理中更新表和代码模块中的各个对象脚本,以反映数据库的新格式化版本。当然,源代码管理中的规范源代码是唯一可以保存CREATE TABLE语句格式以及所有注释的地方。

幸运的是,一旦您生成了构建脚本,并使用SQL Prompt对其进行了格式化,SQL Compare可以为您完成剩下的这项艰苦工作。

步骤1:在SSMS中生成并格式化构建脚本

第一项任务是生成最新的数据库构建脚本。最简单的方法是在沙箱中使用SSMS Generate Scripts向导,在开发数据库的最新副本上。在SSMS对象资源管理器窗格中,右键单击要进行美化的源代码的开发数据库。然后导航任务 | 生成脚本...以启动向导。

25word-image-34.png

我们将为新数据库生成所有内容,并将其放在新的查询窗口中。

26word-image-35.png

向导的其余部分是不言而喻的。您将在新的查询窗口中找到构建脚本。

我们不想重建我们的开发数据库,因此,在构建脚本中,我们需要将对数据库的所有引用更改为新数据库的名称。这些引用将被SSMS括起来,因此您应该在全局搜索中包含这些括号,并在数据库名称上替换表达式,无论它们在何处引用。因此,如果您的数据库名为Snibbo,并且您希望构建脚本创建NewSnibbo,则找到[Snibbo]并替换为[NewSnibbo]。通过这样做,即使“find”字符串在注释、字符串或其他符号的其他地方使用,操作也会更加安全。因为除非您使用数据库名称作为数据库对象的名称,否则它们将不带括号。即使您不明智地调用数据库[Select],如果将其更改为[SelectCopy] ,也不会损害您的查询。

脚本开头的CREATE DATABASE语句需要更改为最简单的...

CREATE DATABASE <nameOfNewDatabase>

然后,您应该可以通过单击菜单项SQL Prompt > Format SQL轻松地重新格式化此脚本。(或按Ctrl K Ctrl Y)。由于您可能已选择删除不必要的方括号,因此最好先更改数据库名称。

步骤2:使用SQL Compare自动生成部署脚本

下一个任务是使SQL Compare创建一个部署脚本,该脚本可以改变开发数据库中的每个代码模块以反映新的格式。

此时您有两种选择:

  • 将重新格式化的构建脚本保存到文件中,并将其与当前数据库进行比较,或

  • 使用重新格式化的构建脚本来创建新数据库并从中进行同步。

我将演示第二种技术,因此我们需要使用构建脚本临时创建一个新版本的数据库,该版本将在其模块中包含所有重新格式化的代码。

在这个例子中,使用Sandbox开发服务器,我已经使用了一个名为PhilsScripts的数据库,其中包含大量的诊断脚本。已经生成了一个构建脚本,对其进行了格式化,并使用该构建脚本在名为BetterPhilsScripts的服务器上创建了一个新数据库。然后执行SQL Compare并指定新格式化的BetterPhilsScripts作为源,并将PhilsScripts指定为目标。

27word-image-36(1).jpg

我们比较两者并发现SQL Compare已检测到SQL Prompt所做的所有更改。然后,我们检查部署脚本,当我们满意时,我们会部署更改。

28word-image-37(1).jpg

步骤3:更新源代码管理

使用SQL Compare,您可以将数据库保存在脚本目录中,或更新源控制系统的现有脚本目录。这会将每个对象保存在自己的文件中,但也可以维护构建脚本。我使用PowerShell脚本来执行此操作;当我在开发数据库中一次更改多个对象时,它会定期保存对象脚本,然后我可以使用Github Desktop或Gmaster通过本地存储库进行检查。

整理

因此,通过SQL Prompt和SQL Compare的组合,不仅可以重新格式化整个数据库或模式的例程,还可以更新单个源文件或构建脚本以进行源代码控制。如果您使用“迁移”方法进行数据库开发,则还可以将SQL Compare同步脚本保存为源代码控制,作为迁移脚本的基础。这一切都使得重新格式化SQL代码变得更加愉快,而不仅仅是一件苦差事。


本周热门