SQL,如何在不打破其他依赖性的情况下更改SQL表中的列?
-
28-09-2019 - |
题
我敢肯定,这可能是很普遍的查询,但现在找不到好的答案。
这是我的问题:
我有一张名字叫 联系人 带有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显然可能会更加困难。
其他提示
正如其他人指出的那样,这取决于您的RDBMS。
有两种方法:
- 更改表并修复所有依赖关系
- 您可以看出您可以使用而不是直接访问表(这可以防止您免受基础核心表中的未来更改,但是您可能会丢失一些更新功能,具体取决于您的DBMS)
使用sp_depperiand“表名”检查表的依赖项,然后使用SP_RENAME重命名非常有用的列名。 SP_RENAME每当重命名为主键或唯一约束时,自动重命名关联的索引。如果重命名的索引与主密钥约束相关,则主要密钥约束也会由SP_RENAME自动重命名。
然后开始更新过程,并逐一更新功能,如果您发现的话,也没有其他好的更改选择。