使用 SQL Refactor 加快数据库开发速度





0/5 (0投票)
2007年1月8日
11分钟阅读

22121
SQL Refactor 工具旨在帮助 SQL Server 开发人员和 DBA 更高效、更快速地处理遗留代码,帮助他们改进数据库代码的设计和可维护性,并大大减少执行更复杂的数据库重构所需的时间和精力。
引言
设计和创建新数据库是一项经过充分研究的任务,但在我的经验中,数据库管理员和开发人员花费大部分时间并非如此。更常见的情况是需要处理已建立的数据库,以及由前任开发人员或同事编写的 SQL 代码。事实上,SQL Server DBA 管理多达 50 个不同的 SQL Server 并不罕见,因此他们对每个服务器上的数据库架构可以被认为是“不熟悉”的。
因此,当需要进行数据库修改时,DBA 可能需要花费很长时间来解读要修改的脚本,并探索要更改的数据库架构。
这一观察促使我为 Red Gate 设计了一款新工具,名为 **SQL Refactor**,它是 SQL 2005 中 Management Studio 的一个插件。
该工具旨在帮助 SQL Server 开发人员和 DBA 更高效、更快速地处理遗留代码,帮助他们改进数据库代码的设计和可维护性,并大大减少执行更复杂的数据库重构(例如对象重命名或表拆分)所需的时间和精力。在本文中,我将介绍 SQL Refactor 的所有主要功能。
- 布局 SQL,格式化您的 SQL 语句。
- 脚本摘要
- 大写关键字
- 查找未使用的变量和参数
- 限定对象名称
- 展开通配符
- 将选定内容封装为新存储过程
- 智能重命名数据库对象
- 表拆分
SQL Refactor 功能
SQL Refactor 是一组实用工具,旨在帮助探索遗留代码的过程,加快架构更改的速度,并总体上促进日常数据库开发。其中一些实用工具可归类为重构实用工具,它们会更改 SQL 代码或架构,而不影响数据库的行为。其他工具则侵入性较小,根本不更改数据库架构或 SQL 语句。
在设计 SQL Refactor 的过程中,我确定了近四十种可能的功能,这些功能可以帮助提高 SQL Server 开发人员或 DBA 的生产力。此列表已根据我分配给每一项的 **相对价值** 进行筛选:
- 该功能可能节省的时间量
- 使用频率
- 替代方案的可用性
显然,投入大量开发精力到一个可以通过简单的复制粘贴操作和几次搜索替换就能解决的功能上,是没有多大意义的。
最终被选中的 SQL Refactor 功能可以通过多种方式进行分类。在本文中,我将其分为以下几类:
- 理解遗留代码 - 此类功能旨在改善 SQL 代码的布局和可读性,以便能够轻松理解其结构、总体意图和主要功能。这些功能可能会更改代码格式,但不会对实际架构更改产生侵入性。
- 改进代码设计 - 用于修改脚本以改进其设计、可维护性和可读性的功能。
- 主要架构重构 - 对数据库架构进行实质性修改的复杂重构。
理解遗留代码
这些功能将日常使用。此处涵盖的功能包括:
- 布局 SQL,格式化您的 SQL 语句。
- 大写关键字
- 脚本摘要
- 查找未使用的变量和参数
布局 SQL
数据库管理员和开发人员使用各种各样的工具来显示 SQL 语句。其中大多数工具提供基本功能,例如以颜色显示代码和识别。**布局 SQL** 是下一步。
一个格式良好的 SQL 脚本会缩进嵌套的语句,通过这样做可以快速识别 SQL 代码的各个部分。
根据脚本的大小,此功能可以节省大量时间。我预计这将是该工具中最受欢迎且最常用的功能。预计每次编写或重写语句时,都会进行缩进并以新的布局进行持久化。
自动格式化代码的最大挑战可能在于试图适应各种不同的个人风格偏好。由于没有 SQL 布局的“标准”,并且 SQL 语言不像 C 语言那样严格结构化,人们已经发展出大量相互冲突的约定。此外,由于只有少数工具可以进行缩进,即使是这些工具功能也有限,因此这些约定很少被强制执行。开发 SQL Refactor 时面临的挑战之一是识别各种风格,并将它们转化为选项。该产品的第一版支持约 37 个选项。大量的选项允许进行精细的自定义,但对更多选项的需求似乎无穷无尽。在我们进行 beta 测试期间,我们收到了超过 80 个选项的请求。
关键字大写
格式化 SQL 通常伴随着一种编码风格,即 SQL 关键字应大写。这种风格有助于识别关键字,在不支持颜色编码的开发环境中尤其有用。**大写关键字** 功能正如其名。但是,它也有局限性。许多人使用动态 SQL。修改字符串的内容,尤其是当这些单个字符串大多数时候不是有效语句时,这是一个留待将来解决的挑战。许多 beta 测试人员想知道为什么此功能是布局 SQL 功能的一部分。主要原因是有些人不想布局他们的 SQL,但仍然想大写关键字。该产品的所有功能都应视为可按顺序使用的构建块。它们可以通过快捷键轻松访问,因此此限制不会带来显著的开销。
脚本摘要
另一个有助于开发人员理解遗留代码的功能是 **脚本摘要**。这提供了脚本的高级概述,并且还允许导航。它是脚本的层次视图,即,如果脚本创建了几个存储过程、触发器等,则可以折叠不太重要的对象的定义。摘要列表中提供的信息隐藏了许多细节。例如,对于 select 语句,脚本摘要列出了 select 语句从中检索数据的表和返回表的函数,但隐藏了这些表连接在一起的方式,并隐藏了子查询结构。图 1 中的截图有助于可视化此功能。
查找未使用的变量和参数
另一个分析 SQL 脚本的功能是“**查找未使用的变量和参数**”。存储过程和 SQL 代码都会演变,由于 SQL 在持久化之前不会被编译,因此其中可能会留下垃圾。这无疑增加了阅读和维护的难度。所述功能可识别未使用的变量和参数,包括已赋值但未曾使用该赋值的变量和参数。
改进代码设计
到目前为止,我们讨论的功能除了添加空格外,并没有修改脚本或数据库。现在是时候转向稍微具有侵入性一些的功能了,您可以使用它们来改进脚本的设计和可维护性。
- 限定对象名称
- 展开通配符
- 将选定内容封装为新存储过程
限定对象名称
此重构是这一系列功能中最直接的。它将对象名称更改为其完全限定版本。例如,**Employees** 表变为 **HumanResources.Employees**。同样,未加别名或未限定的列引用将被转换为其限定版本。
展开通配符
最佳实践规定,不应在 **SELECT** 语句中使用通配符,而应正确列出要选择的列。当开发人员看到违反此最佳实践的行为时,他们可以使用我们的“**展开通配符**”功能,该功能会重写 **SELECT** 语句的相关部分。当查询引用的数据库架构不经常使用,或者开发人员不熟悉它时,此操作最有可能节省大量时间。
封装为存储过程
在为 C# 等编程语言编写的重构工具中,一种非常流行的重构是将一段代码封装到一个新的、可重用的代码单元中,通常是过程或方法。
SQL 代码的等效功能由“**封装为存储过程**”重构提供。它将一段代码转换为存储过程,并用对新创建存储过程的调用替换原始代码段。它会识别选定 SQL 代码中的变量,并智能地决定该变量需要更改为哪种类型的参数。例如,如果一个变量在选定块之前被赋值,其值在选定块内被使用或修改,然后在此选定块之后的代码中被查询,则该参数将被声明为输入/输出参数。
预计此重构将在数据库开发阶段频繁使用。尽管此重构相当复杂,但手动执行仍然相对容易。然而,自动识别应转换为参数的变量无疑将为开发人员节省大量时间。
主要架构重构
现在我们开始讨论最复杂的重构——那些实质性地修改数据库架构的重构。
- 智能数据库对象重命名
- 表拆分
这些功能需要相对不频繁地使用,但当需要时,它们可能为您节省大量时间。
智能对象重命名
从数据库架构的角度来看,**智能对象重命名** 是一种更具侵入性的重构。实际上,它甚至不是一个单一的重构,而是一整组重构。此重构组会生成一个脚本,用于重命名存储过程、函数、视图、表或它们的列或参数。此重命名操作还会以一致的顺序修改引用的数据库对象。
此重构虽然预计很少使用,但可以节省大量时间。在数据库管理系统中,依赖关系的映射很困难。找出哪些视图引用了特定的表或视图可能需要阅读所有数据库对象的定义。如果出现错误,例如,某个视图未正确更新以引用重命名后的对象,则该错误可能在需要使用损坏的对象时很长时间后才会被发现。
智能对象重命名重构会识别所有文本数据库对象,并修改它们以使用更改后的名称。修改脚本会考虑重构的级联效应,并相应地排序数据库操作。由于它提供了脚本作为输出,因此可以进一步修改此脚本以包含额外的业务逻辑。如果此业务逻辑不影响修改对象的依赖关系,脚本将成功执行。
表拆分
到目前为止,SQL Refactor 功能列表中最复杂的重构是“表拆分”。该工具包含此功能是受到两个常见问题的驱动:
- 缺少参照完整性表
- 部署后数据库重新设计
在前一种情况下,需要添加领域限制。后一种问题更复杂。即使是设计良好的数据库,需求也可能发生变化,数据库架构也可能在生产中使用后进行调整。例如,银行合并可能会改变映射到单个表中的实体的关系,而这种关系现在必须使用两个表来表示。
问题在于,在数据库设计阶段,不存在数据和诸如视图、存储过程等文本对象的引用概念。一旦表填充了真实数据,将相同的数据输入到新的架构结构中将非常昂贵。表拆分重构试图帮助解决这种情况。它允许将一个表拆分成两个,然后重写数据库中依赖的文本对象。基于共享列,它将为主表设置主键,然后自动在主表和新表之间建立外键关系,并用连接语句替换原始表引用。它将根据共享列的可空性,智能地决定使用 INNER 和 OUTER 连接。
表拆分重构预计不会经常使用,并且存在局限性。然而,通过创建脚本来完成表拆分所节省的时间使其成为一个有价值的重构。
摘要
**SQL Refactor** 是一款工具,我希望它能让 SQL Server 开发人员和 DBA 对其 SQL 代码和数据库对象进行重大更改,而对数据库或使用它的应用程序的行为没有任何影响。
SQL Refactor 中提供的所有重构和实用工具都是从大量潜在重构中选择最有价值的。如果您对这些重构有任何反馈,或者对未来版本的新重构有建议,请通过 电子邮件 或 Red Gate 论坛 与我联系。
未来,您应该会看到更多文章,更详细地阐述各种重构,并逐一详细介绍。