SQL Prompt根据数据库的对象名称、语法和代码片段自动进行检索,为用户提供合适的代码选择。自动脚本设置使代码简单易读--当开发者不大熟悉脚本时尤其有用。SQL Prompt安装即可使用,能大幅提高编码效率。此外,用户还可根据需要进行自定义,使之以预想的方式工作。
本教程演示了SQL Prompt如何显著地减少偶尔出现的“重量级”数据库重构过程所带来的痛苦,例如重命名模块、表和列(智能重命名)或拆分表(拆分表)。
SQL Prompt提供的许多工具都是您每天编写T-SQL代码时都会或多或少使用的工具。SQL Prompt中的重构工具更像是您在沙漠中进行长时间远足时所使用的snakebite工具包中的工具。您希望不必经常使用它们,但是当您使用它们时,它们将非常有价值。一个不太常见但较难的需求是更改对象的“公共接口”,例如通过更改对象或列的名称,甚至通过拆分表来实现更好的设计。
智能重命名
在SSMS对象资源管理器中选择了一个对象后,SQL Prompt的“智能重命名”向导将生成一个脚本来重命名该对象,并修改引用重命名对象的对象。将以正确的顺序进行修改以维护数据库的完整性。
由于数据库中可能存在所有依赖项,因此更改代码对象、表或列的名称可能是一项费力甚至是艰巨的任务。在所有代码和约束中,您必须确保了解一项看似简单的更改的所有可能的副作用。合理地,手动进行这些更改可能只需要几个小时,但是谁有几个小时呢?
SQL Server提供了一些工具来帮助您发现依赖关系,例如sys.sql_expression_dependencies目录视图,或者您可以在SSMS中使用对象依赖关系查看器,只需右键单击对象,然后选择“查看依赖项”,尽管UI有点依靠细节。
另外,Redgate的SQL Dependency Tracker工具与SSMS集成在一起,并为任何选定对象提供详细的依赖关系图。例如,在SSMS对象资源管理器中,右键单击Purchasing.PurchaseOrders,在WideWorldImporters数据库中,选择“查看依赖关系图[对象] ...“。图1显示了许多引用它的对象。
图1
如果您需要手动更改名称,此图表明您要完成的任务的艰巨性。幸运的是,我们可以使用SQL Prompt的智能重命名功能,该功能将自动修改当前数据库中几乎所有对重命名对象的引用。动态SQL引用将不被处理,因此此功能不会消除对可靠测试计划的需要。
我们将从最简单的数据库重构任务开始,重命名代码模块,然后逐步提高复杂性和风险性,重命名表,最后重命名列。
重命名代码对象
假设您编写了一个新的存储过程,Purchasing.PurchaseOrder$ListFinalized该存储过程调用了一个现有的存储过程Purchasing.PurchaseOrder$List,以获取仅包含最终定单的结果集。
CREATE PROCEDURE Purchasing.PurchaseOrder$List ( @IsOrderFinalized bit ) AS BEGIN SELECT PurchaseOrders.PurchaseOrderID, PurchaseOrders.OrderDate, PurchaseOrders.IsOrderFinalized FROM Purchasing.PurchaseOrders WHERE IsOrderFinalized = @IsOrderFinalized; END; GO CREATE PROCEDURE Purchasing.PurchaseOrder$ListFinalized AS BEGIN EXEC Purchasing.[PurchaseOrder$List] @IsOrderFinalized = 1; END;
清单1
现在,您决定需要将现有Purchasing.PurchaseOrder$List过程的名称更改为PurchaseOrder$ListAll,以阐明它将返回所有采购订单,无论它们是否已完成。
在对象资源管理器中选择:如果您已经在对象资源管理器中打开服务器,则可以在查询窗口中右键单击名称,然后选择“在对象资源管理器中选择”。如果自创建对象以来尚未刷新列表,则可能只会使您靠近列表中的对象。
在SSMS对象资源管理器中找到存储过程之后,您可以通过按F2或右键单击并选择Rename来对其进行重命名,但是所有要做的就是对对象进行重命名,因此任何仍通过其旧名称引用该对象的现有代码都将对其进行重命名,现在都将失败。
消息2812,级别16,状态62,过程购买。PurchaseOrder$ ListFinalized,第4行
找不到存储过程“Purchasing.PurchaseOrder $ List”。
相反,我们将使用SQL Prompt的智能重命名功能。Purchasing.PurchaseOrder$List在对象资源管理器中右键单击,然后选择“智能重命名”。在对话框中将名称更改为PurchaseOrder$ListAll,如图2所示。
图2
单击“下一步