可以在SQL Server中重构数据库吗?

时间:2012-05-21 20:51:12

标签: visual-studio-2010 sql-server-2008 refactoring

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

  • 数据库工作
  • 观点工作
  • 存储过程正常工作

然而,自该项目启动以来,该项目的总体范围已大大增加,现在一些表名和字段名称略有偏差。

例如,数据库中的主表名为SheetMetalRequest,但项目已经增长到现在的实际钣金请求,但是其中一种是可枚举的请求类型。因此,此表中的名称会误导参与该项目的人员。

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

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

如果 Refactor 能力某种方式与Visual Studio中存在的内容相同,则 GREAT

SELECT SERVERPROPERTY('productversion'), SERVERPROPERTY('productlevel'), SERVERPROPERTY('edition')

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

2 个答案:

答案 0 :(得分: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更新所有模块两次,以确保您已完全更正了依赖项。)

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

答案 1 :(得分:1)

Red Gate的SQL Prompt具有“智能重命名”功能,听起来就像您正在寻找的那样。这不仅会重命名对象,还会重命名其他对象中的对象。这是我工作的公司的商业工具,但有一个为期14天的全功能评估期。

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