SQL,如何更改SQL表中的列而不破坏其他依赖项?

时间:2010-06-21 11:16:20

标签: sql sql-server-2005 refactoring-databases

我确信这可能是非常常见的查询,但现在找不到好的答案。

这是我的问题:

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

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

我们使用:MSSQL 2005,数据已经迁移,只想更改架构。

修改

感谢All快速重播。

就像提到的那样 Contacts 表有超过60个依赖项,但是当运行以下查询时,只有5个使用标题列。迁移脚本已运行,因此无需更改数据。

/*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 个答案:

答案 0 :(得分:3)

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

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

编辑:甚至还有一本关于它的书! Refactoring Databases

答案 1 :(得分:2)

正如其他人指出的那样取决于你的RDBMS。

有两种方法:

  • 对表进行更改并修复所有依赖项
  • 提供一个视图,您可以使用而不是直接访问表(这可以保护您免受底层核心表的未来更改,但您可能会丢失一些更新功能,具体取决于您的DBMS)

答案 2 :(得分: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时应该会收到错误消息。

如果您在查询中使用*或在您的应用程序中使用adhoc SQL,显然事情可能会有点困难。

答案 3 :(得分:0)

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

然后开始逐个更新过程和函数没有其他好的选择,如果你找到了这样的改变,那么告诉我。