我想重命名表格中的列。我看到两种方法
使用sp_rename()
并修改存储过程以引用新名称。
创建新列,将数据从旧列复制到新列,修改存储过程等以引用新列,最后删除旧列。
我们无法使用#1作为重命名列可能会导致存储过程中断,我们无法承受任何停机时间。
如果我们使用#2,那么在将数据从旧列复制到新列之后但在部署存储过程以使用新列之前,旧列和新列可能会共存一段时间。
有没有办法让新列与对旧列进行的任何更新/插入/删除同步?
AFTER
触发器可以帮助吗?但触发器通常会增加交易时间,因此可能不是一个有利的解决方案。sp_rename()也会干净地更新对列的所有引用 - 比如存储过程,函数,索引等吗?
答案 0 :(得分:2)
您可以使用旧表名重命名表并创建视图,并让视图包含列的别名。
redgate的SQLPrompt 有一个名为Smart Rename的功能,可以重命名列并更新对新名称的所有引用。
从SQL Prompt 7文档:
SQL Prompt可以创建一个脚本,允许您在不破坏依赖关系的情况下重命名数据库中的对象。您可以重命名以下内容:
表格(包括专栏)
观点(包括列)
存储过程(包括参数)
功能(包括参数)
重命名对象时:
- SQL Prompt还修改引用或重命名对象引用的任何对象,以确保依赖链接不会被破坏。
如果以前使用SQL Server Management Studio或Enterprise Manager重命名重命名了对象,或者使用T-SQL sp_rename命令,则对象定义将包含原始名称。
不会更新引用此原始名称的任何对象。
为帮助您找到引用不再存在的对象的对象,请参阅查找无效对象。
- 保留对象的原始权限和扩展属性。
答案 1 :(得分:2)
首先确认没有从数据库外部引用该列,例如直接查询列而不经过存储过程的应用程序代码。
以下是我在不导致停机的情况下重命名列的方法 -
现在所有代码都已转换为使用新列,我们需要清理 -