我敢肯定,这可能是很普遍的查询,但现在找不到好的答案。

这是我的问题:

我有一张名字叫 联系人 带有VARCHAR列 标题. 。现在在开发中间,我想替换字段 标题titleid 这是外国钥匙 联系人 桌子。目前的桌子 联系人 具有60多个依赖关系(其他表,视图功能)。

我该怎么做最安全,最简单的方法?

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

编辑:

感谢所有人的快速重播。

就像提到 联系人 表有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个观看次数,并手动更新了它们。

有帮助吗?

解决方案

对于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%' 

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

脚本脚本对管理工作室的所有感兴趣,然后简单地删除列表并将其全部审查并将创建更改为“更改”。即使对于60个可能的依赖性,这也应该是一个简单而重复的变化。另外,如果您指的是不存在的列,则在运行脚本进行更改时,应该会收到错误消息。

如果您使用 * 在您的应用程序中,您的疑问或Adhoc SQL显然可能会更加困难。

其他提示

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

如果数据要更改,您必须小心,并确保对 Title 列还更改 ContactTitles 桌子。进行重构时,您只需要保持它们的同步即可。

编辑: 甚至还有一本书! 重构数据库.

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

有两种方法:

  • 更改表并修复所有依赖关系
  • 您可以看出您可以使用而不是直接访问表(这可以防止您免受基础核心表中的未来更改,但是您可能会丢失一些更新功能,具体取决于您的DBMS)

使用sp_depperiand“表名”检查表的依赖项,然后使用SP_RENAME重命名非常有用的列名。 SP_RENAME每当重命名为主键或唯一约束时,自动重命名关联的索引。如果重命名的索引与主密钥约束相关,则主要密钥约束也会由SP_RENAME自动重命名。

然后开始更新过程,并逐一更新功能,如果您发现的话,也没有其他好的更改选择。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top