我确信这可能是非常常见的查询,但现在找不到好的答案。
这是我的问题:
我有一个名为 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个视图并手动更新。
答案 0 :(得分:3)
使用refactoring方法。首先创建一个名为TitleID
的新字段,然后将所有标题复制到ContactTitles
表中。然后,逐个更新每个依赖项以使用TitleID字段。确保在每一步之后仍然有一个正常工作的系统。
如果数据发生变化,您必须小心并确保对Title
列的任何更改也会更改ContactTitles
表。在进行重构时,您只需要保持同步。
编辑:甚至还有一本关于它的书! Refactoring Databases
答案 1 :(得分:2)
正如其他人指出的那样取决于你的RDBMS。
有两种方法:
答案 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约束。
然后开始逐个更新过程和函数没有其他好的选择,如果你找到了这样的改变,那么告诉我。