SQL Server中的数据库能否进行重构?

3
我们有一个比较新的数据库项目,我们已经为其编写了视图和存储过程,持续了大约6个月左右。
  • 数据库工作正常
  • 视图工作正常
  • 存储过程工作正常
然而,由于项目的总体范围已经显著增长,一些表名和字段名现在有点偏差。
例如,数据库中的主表称为SheetMetalRequest,但是由于项目已经发展到实际的Sheet Metal Request仅是请求类型之一。因此,这个表的名称对于刚接触该项目的人来说可能会误导他们。
除了这个主表之外,其他表中的各种列也需要进行更改(例如SheetMetalRequestID)。
进行这种更改的问题是现在该数据库中有10个不同的视图和30个存储过程。如果某些内容发生更改,但并非所有内容都随之更改,那么我们的预生产数据库可能需要花费数小时才能重新运行。
如果Visual Studio中存在某种重构功能,那将是非常好的。
SELECT SERVERPROPERTY('productversion'), SERVERPROPERTY('productlevel'), SERVERPROPERTY('edition')

productversion | productlevel | edition
10.0.1600.22   | RTM          | Standard Edition (64-bit)

可能是重复的问题:https://dev59.com/OnI95IYBdhLWcg3wsQP9 - zmbq
2
SQL Server 2012提供的SQL Server开发人员工具(代号“Juneau”)(请在此处查看有关它们的Channel 9介绍视频)可能是实现此目的的一种方式。 - marc_s
1
不同意潜在的重复。其他问题的答案似乎主要关注格式化代码。我认为这个答案可以更好。虽然被接受的答案确实指向了一个可能有用的第三方工具,但肯定还有一些注意事项没有提到... - Aaron Bertrand
2个回答

3
如果 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在一个循环中进行两次模块更新,以确保你已经完全纠正了依赖关系。

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


2
还可以查看我为mssqltips.com撰写的这篇技巧:http://www.mssqltips.com/sqlservertip/2071/make-your-sql-server-database-changes-backward-compatible-when-renaming-an-entity/ - Aaron Bertrand
谢谢Bertrand先生。让我自己处理一下这个问题,这可能是我一直在寻找的答案。 - user153923

1
Red Gate的SQL Prompt有一个“智能重命名”功能,听起来像是你正在寻找的。这不仅会重命名对象,还会重命名其他对象中对它的任何引用。这是我们公司的一款商业工具,但有一个14天完全功能评估期。
请参见http://www.red-gate.com/products/sql-development/sql-prompt/features

感谢留言,David。不过到目前为止,我已经几乎处理完所有的更改 - 而且这一点都不好玩! - user153923
1
没问题。一个在这些情况下也能帮助的免费工具是 SQL Search。http://www.red-gate.com/products/sql-development/sql-search/ - David Atkinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接