logo SQL Prompt教程 我也要发布文档

SQL语法提示工具SQL Prompt教程:使用SQL Prompt重构数据库(下)


SQL Prompt根据数据库的对象名称、语法和代码片段自动进行检索,为用户提供合适的代码选择。自动脚本设置使代码简单易读--当开发者不大熟悉脚本时尤其有用。SQL Prompt安装即可使用,能大幅提高编码效率。此外,用户还可根据需要进行自定义,使之以预想的方式工作。

点击下载SQL Prompt正式版

本教程演示了SQL Prompt如何显著地减少偶尔出现的“重量级”数据库重构过程所带来的痛苦,例如重命名模块、表和列(智能重命名)或拆分表(拆分表)。前面小编介绍了教程上半部分内容“智能重命名”,现在主要介绍后半部分内容——拆分表~

拆分表

通过在SSMS对象资源管理器中选择一个对象,SQL Prompt的“拆分表”向导旨在生成一个脚本,该脚本创建链接表、修改原始表以及修改引用主表的任何对象。检查脚本后,您可以执行它。SQL Prompt将所有更改包装在一个事务中,因此可以将它们回滚以防万一发生任何错误。

您将不需要将现有表一分为二,也不必冒着被破坏的风险,但是当您这样做时,SQL Prompt的“拆分表”功能可以节省大量时间和精力。我考虑这样做的主要原因是出于性能原因,“隔离”现有表中的非常大的列,但有时只是为了方便起见。

例如,假设我们要向Purchasing.ThePurchaseOrders表中添加系统版本控制。我们只想将版本历史记录保留在该OrderDate2列中。实际上,即使我们想对表格的大部分内容进行版本控制,也可能不想在两个nvarchar(max)列上保留历史记录,因为每次更新都会创建一个新的文本副本,副本最多可包含2GB的文本。

因此,我们的目标是将OrderDate2列移出ThePurchaseOrders表并移到新表中,然后可以对其应用系统版本控制。右键单击ThePurchaseOrders表,选择“拆分表”,将出现向导。为新的辅助表命名,如ThePurchaseOrdersTemporal,然后在下一个屏幕上,将复制键PurchaseOrderId,然后将OrderDate2移动到新表中,如图5所示。两个表都将具有主键,因此不能有重复的行在两个表中。

SQL语法提示工具SQL Prompt教程:使用SQL Prompt重构数据库(下)

图5

下一个屏幕将要求您创建一个外键,该外键确定了将数据插入这些表的顺序。

SQL语法提示工具SQL Prompt教程:使用SQL Prompt重构数据库(下)

图6

这样可确保添加到Purchasing.ThePurchaseOrders表中的任何行都引用的PurchaseOrderID列中的现有值Purchasing.ThePurchaseOrdersTemporal。

单击“下一步”,您将看到有关将要执行的操作,所做更改的依赖性以及与所需操作有关的所有警告的信息。在这种情况下,我们会看到警告,它不能处理非标准文件组,也不能保证在从父表中删除列时不能自动保留数据(尽管在这种情况下,生成的脚本会将您的数据保存在新表中)。

SQL语法提示工具SQL Prompt教程:使用SQL Prompt重构数据库(下)

图7

当然,您总是希望检查和微调这些生成的脚本之一。SQL Prompt可能不会每次都正确。您需要确保该工具所做的更改符合您计划使用数据的方式。例如,该OrderDate2列定义为NOT NULL。但是,既然该列在相关表中,则该列在技术上可以为空,因为您不能强制使用1-1关系。

单击查看脚本按钮将使该工具生成一个脚本,您可以使用该脚本来应用更改。它将创建新表及其主键,将数据加载到新创建的表中,从原始表中删除该列,更改所有相关对象,添加FOREIGN KEY并最终在新表的列上建立扩展属性。

将更改所有从属对象以解决新的架构设计。 例如,修改了PurchaseOrder $ ListAll过程以替换对Purchasing.ThePurchaseOrders的引用,并在Purchasing.ThePurchaseOrders和Purchasing.ThePurchaseOrdersTemporal之间使用INNER JOIN进行替换,如清单7所示。

这是INNER JOIN因为期望这两行都是必需的,因为它们将一起成为表的一部分。即使您只选择了允许NULL值的列也是如此(您可能不希望如此,因此请单独检查每种情况并相应地更改代码)。

ALTER PROCEDURE Purchasing.[PurchaseOrder$ListAll]
  (
      @IsOrderFinalized bit
  ) AS
  BEGIN
      SELECT ThePurchaseOrders.PurchaseOrderID, 
             ThePurchaseOrdersTemporal.OrderDate, 
                     ThePurchaseOrders.IsOrderFinalized
      FROM   <strong>(Purchasing.ThePurchaseOrders INNER JOIN   </strong>
  <strong>            Purchasing.ThePurchaseOrdersTemporal ON </strong>
  <strong>                  ThePurchaseOrders.purchaseorderid=</strong>
  <strong>                  ThePurchaseOrdersTemporal.purchaseorderid)</strong>
      WHERE  IsOrderFinalized = @IsOrderFinalized;
  END;

清单7

与修改表并可能发生数据丢失的任何过程一样,强烈建议您检查生成的脚本,并在数据库结构的副本上至少测试一次部署,如果脚本中的内容有误,请进行备份。一旦完全满意,就可以运行脚本,然后将时间扩展应用于Purchasing.ThePurchaseOrdersTemporal表,而不是原始表。

最后提醒您测试您的代码,并确保所有代码在SQL Server对象和用户界面中均按预期工作。您正在极大地改变对象与外界的接口。

结论

在本教程中,我们研究了SQL Prompt中两个最少使用的功能,但是在您需要它们时它们是无价的。如果您必须重命名对象或列,甚至将一个表拆分为两个表,毫无疑问,智能重命名和拆分表功能可以为您节省大量时间,特别是如果您已实现SQL Server使用以服务器为中心的范例的数据库,其中包含约束、触发器和存储过程。

您可以用更少的精力来进行大规模的名称和结构更改,这意味着您可以投入更多的时间和精力来测试应用程序在重构后将继续按预期正常运行。

本教程内容到这里就完结啦,感兴趣的朋友可以继续关注我们后续内容哦~也可以下载SQL Prompt试用版体验一下~

相关内容推荐:

SQL语法提示工具SQL Prompt教程:使用SQL Prompt重构数据库(下)

SQL Prompt系列教程>>>


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