无需停机即可重命名现有列

Hap*_*own 2 t-sql sql-server sql-server-2012

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

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

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

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

有什么方法可以使新列与对旧列所做的任何更新/插入/删除保持同步?

  1. 在可AFTER触发帮助吗?但是触发器通常会增加事务时间,因此可能不是一个有利的解决方案。
  2. 我可以在同一个表的两列之间复制数据吗?
  3. 还有其他可能的解决方案吗?

sp_rename() 是否也干净地更新了对列的所有引用 - 如存储过程、函数、索引等?

Hap*_*own 6

首先确认没有像应用程序代码直接查询列而不通过存储过程那样从数据库外部引用该列。

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

  1. 在现有列之外添加一个新列。新列与旧列具有相同的数据类型,但具有新名称。还要根据用例在新列上创建索引、修改复制等。
  2. 修改所有向旧列写入(插入/更新操作)的存储过程,以便同时在新列中插入/更新。
  3. 将旧列中的数据复制到现有记录的新列中。步骤 2 和 3 现在一起确保新列将与旧列保持同步。
  4. 将从旧列读取的所有存储过程修改为现在从新列读取。

现在所有代码都已转换为使用新列,我们需要清理 -

  1. 修改先前步骤#2 中的存储过程以停止引用旧列。
  2. 删除旧列。