5

我确信这可能是很常见的查询,但目前找不到好的答案。

这是我的问题:

我有一个名为Contacts的表,其中包含 varchar 列Title。现在在开发过程中,我想用TitleID替换字段Title ,它是ContactTitles表的外键。目前表Contacts有超过 60 个依赖项(其他表、视图函数)。

我怎样才能以最安全和最简单的方式做到这一点?

我们用的是:MSSQL 2005,数据已经迁移了,只是想改一下schema。

编辑:

感谢所有人的快速重播。

就像之前提到的那样, Contacts表有 60 多个受抚养人,但是在运行以下查询时,其中只有 5 个使用Title列。迁移脚本已运行,因此无需更改数据。

/*gets all objects which use specified column */

SELECT Name FROM syscomments sc JOIN sysobjects so ON sc.id = so.id WHERE TEXT LIKE '%Title%' AND TEXT LIKE '%TitleID%'

然后我浏览了这 5 个视图并手动更新了它们。

4

4 回答 4

3

使用重构方法。首先创建一个名为 的新字段TitleID,然后将所有标题复制到ContactTitles表中。然后,一个一个地更新每个依赖项以使用 TitleID 字段。只要确保在每一步之后你仍然有一个工作系统。

如果数据将发生变化,您必须小心并确保对Title列的任何更改也会更改ContactTitles表。您只需在进行重构时使它们保持同步。

编辑:甚至有一本书关于它!重构数据库

于 2010-06-21T11:18:06.830 回答
2

正如其他人指出的那样,这取决于您的 RDBMS。

有两种方法:

  • 对表进行更改并修复所有依赖项
  • 创建一个您可以使用的视图,而不是直接访问表(这可以防止您将来对底层核心表进行更改,但您可能会丢失一些更新功能,具体取决于您的 DBMS)
于 2010-06-21T11:29:55.593 回答
1

对于 Microsoft SQL Server,Redgate 有一个(不是免费的)产品可以帮助进行这种重构http://www.red-gate.com/products/sql_refactor/index.htm

在过去,我通过简单地获取要查看的内容列表来非常容易地(如果是原始地)做到这一点

SELECT * FROM sys.objects
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%Contacts%' 

(并可能考虑依赖信息并按对象类型过滤)

在 Management Studio 中编写所有感兴趣的脚本,然后简单地查看列表并查看它们并将 CREATE 更改为 ALTER。即使对于 60 个可能的依赖项,它也应该是一个非常简单和重复的更改。此外,如果您指的是不存在的列,则在将脚本运行到 ALTER 时应该会收到一条错误消息。

如果您*在查询中使用或在应用程序中使用临时 SQL,显然事情可能会更困难一些。

于 2010-06-21T11:48:36.250 回答
0

使用 SP_Depend 'Table Name' 检查表的依赖关系,然后使用 SP_Rename 重命名列名,这非常有用。每当重命名 PRIMARY KEY 或 UNIQUE 约束时,sp_rename 都会自动重命名关联索引。如果重命名的索引绑定到 PRIMARY KEY 约束,则 PRIMARY KEY 约束也会由 sp_rename 自动重命名。

然后开始一一更新过程和函数,如果您发现没有其他好的选择可以像这样进行更改,请告诉我。

于 2010-06-21T11:39:32.373 回答