是否可以在 SQL Server 中重构数据库



我们有一个相对较新的数据库项目,在过去的 6 个月左右的时间里,我们一直在编写视图和存储过程。

  • 数据库工作正常
  • 视图有效
  • 存储过程工作

但是,自此项目启动以来,该项目的总体范围已大大扩展,现在一些表名和字段名称有点偏离基础。

例如,数据库中的主表称为 SheetMetalRequest ,但项目已发展到实际钣金请求现在只是可枚举的请求类型之一。因此,此表上的名称会误导进入该项目的人。

除了这个主表之外,其他表中还有各种列也需要更改(例如,SheetMetalRequestID)。

进行此更改的问题是 10 个不同的视图和 30 个存储过程现在是此数据库的一部分。当然,如果某些内容发生了变化,而不是所有内容都随之更改,我们的工作预生产数据库可能需要几个工时才能恢复到运行状态。

如果有一个像Visual Studio中存在的重构能力,那就太好了。

SELECT SERVERPROPERTY('productversion'), SERVERPROPERTY('productlevel'), SERVERPROPERTY('edition')
productversion | productlevel | edition
10.0.1600.22   | RTM          | Standard Edition (64-bit)

如果像 SSDT 这样的工具由于某种原因不适合您,您可以按照自己的节奏手动执行此操作。有时,"点击一个按钮就回家"的方法实际上并不是你想要的。

您可以从引入同义词开始,例如

CREATE SYNONYM dbo.Requests FOR dbo.SheetMetalRequest;

现在,您可以分段重构代码,将每个引用指向新名称。当您确信已捕获所有引用时(即使使用 SSDT 这样的工具,这也不容易,因为它看不到数据库外部的代码 - 甚至看不到当前数据库中动态 SQL 中的代码),您可以删除同义词并重命名表:

BEGIN TRANSACTION;
    DROP SYNONYM dbo.Requests;
    EXEC sp_rename 'dbo.SheetMetalRequest', 'Requests', 'OBJECT';
COMMIT TRANSACTION

(您还需要使用 sp_refreshsqlmodule 循环更新所有模块,两次,以确保已完全更正依赖项。

这将允许您更新代码的不同部分(不仅是视图/存储过程,还包括中间层类甚至前端内容)以引用正确的名称,而不必一次完成所有操作。

Red Gate的SQL提示符具有"智能重命名"功能,听起来就是您正在寻找的。这不仅会重命名对象,还会重命名其他对象中对它的任何引用。这是我工作的公司的商业工具,但有 14 天的完整功能评估期。

请参阅 http://www.red-gate.com/products/sql-development/sql-prompt/features

最新更新