在不停机的情况下重命名现有列

时间:2017-01-19 17:08:36

标签: sql-server tsql sql-server-2012

我想重命名表格中的列。我看到两种方法

  1. 使用sp_rename()并修改存储过程以引用新名称。

  2. 创建新列,将数据从旧列复制到新列,修改存储过程等以引用新列,最后删除旧列。

  3. 我们无法使用#1作为重命名列可能会导致存储过程中断,我们无法承受任何停机时间。
    如果我们使用#2,那么在将数据从旧列复制到新列之后但在部署存储过程以使用新列之前,旧列和新列可能会共存一段时间。

    有没有办法让新列与对旧列进行的任何更新/插入/删除同步?

    1. AFTER触发器可以帮助吗?但触发器通常会增加交易时间,因此可能不是一个有利的解决方案。
    2. 我可以在同一个表的两列之间复制数据吗?
    3. 还有其他可能的解决方案吗?
    4. sp_rename()也会干净地更新对列的所有引用 - 比如存储过程,函数,索引等吗?

2 个答案:

答案 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)

首先确认没有从数据库外部引用该列,例如直接查询列而不经过存储过程的应用程序代码。

以下是我在不导致停机的情况下重命名列的方法 -

  1. 在现有列之外添加新列。新列与旧列具有相同的数据类型,但具有新名称。还可以根据用例在新列上创建索引,修改复制等。
  2. 修改所有写入(插入/更新操作)到旧列的存储过程,以便在新列中插入/更新。
  3. 将旧列中的数据复制到现有记录的新列。第2步和第3步,现在确保新列将与旧列保持同步。
  4. 修改从旧列读取的所有存储过程,现在从新列读取。
  5. 现在所有代码都已转换为使用新列,我们需要清理 -

    1. 修改前面步骤2中的存储过程以停止引用旧列。
    2. 放下旧栏。