【发布时间】:2017-01-19 17:08:35
【问题描述】:
我想重命名表中的列。我看到了两种方法
使用
sp_rename()并修改存储过程以引用新名称。创建新列,将数据从旧列复制到新列,修改存储过程等以引用新列,最终删除旧列。
我们不能使用 #1 作为重命名列可能会导致存储过程中断,我们无法承受任何停机时间。
如果我们使用 #2,则在数据从旧列复制到新列之后但在部署存储过程以使用新列之前,旧列和新列可能会共存一段时间。
有什么方法可以使新列与对旧列所做的任何更新/插入/删除保持同步?
-
AFTER触发器可以在这里提供帮助吗?但触发器通常会增加交易时间,因此可能不是一个有利的解决方案。 - 我可以在同一个表的两列之间复制数据吗?
- 还有其他可能的解决方案吗?
sp_rename() 是否也干净地更新了对列的所有引用——比如存储过程、函数、索引等?
【问题讨论】:
-
sp_rename() 是否干净地更新了对列的所有引用? - 好像不是,Renaming a column in MS SQL Server 2005
-
不,sp_rename 不会更改任何引用该列的对象——但安装过程应该只需要几秒钟。我真的不明白你怎么能更快地做到这一点......如果你不能做到这一点,你将如何维护你的数据库?
-
可能有任何应用程序受到影响?有动态的 SQL 吗?
-
@JamesZ 我们主要分多个步骤进行部署,并通过这种方式确保两个步骤之间的向后兼容性 1) 客户不会注意到由于部署而导致的任何停机时间 2) 我们可以轻松回滚并且只有最后一次更改 3)如果现有功能出现任何问题,我们可以推迟进一步部署。这意味着我们无法保证能够在几秒钟内部署修改后的程序。
-
对我来说,这听起来你只是通过尝试多个步骤来使其过于复杂。如果您只是将列重命名 + 安装过程作为一个步骤,那么一切都应该工作,如果没有,则重命名 + 安装旧版本 - 比尝试提出某种数据复制/复制要简单得多。
标签: sql-server tsql sql-server-2012