2017-01-19 38 views
1

我想重命名表中的列。我看到两种方法在不停机的情况下重命名现有列

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

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

我们不能使用#1,因为重命名列可能会导致存储过程中断,我们无法承受任何停机时间。
如果我们用#2去,有可能性,即新老列将用于将数据从旧的复制到新列,但部署到使用新的列存储过程之前一段时间后共存。

是否有任何方法让新列与旧列的更新/插入/删除保持同步?

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

sp_rename()还干净地更新所有对列的引用 - 比如存储过程,函数,索引等吗?

+0

sp_rename()是否干净地更新对列的所有引用? - 似乎不是,[在MS SQL Server 2005中重命名列](http://stackoverflow.com/questions/1255903/renaming-a-column-in-ms-sql-server-2005) – HappyTown

+2

不,sp_rename不更改引用列的任何对象 - 但安装过程只需要几秒钟。我真的不知道如何更快地做到这一点......并且如果你不能那么做,你如何维护你的数据库? –

+1

可能有任何应用程序受到影响?任何动态SQL浮动? – HABO

回答

1

先确认有来自像应用程序代码直接查询列,而不通过存储过程会在数据库外的列中没有引用。

这里是我改名为列,而不会导致停机时间 -

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

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

  1. 从早期的第2步修改存储过程停止指的是旧列。
  2. 丢弃旧列。
2

你可以重命名表,并使用旧表名创建一个视图,且具有视图包括您的列的别名。


SQLPROMPT由展鹏有一个叫做Smart Rename功能,可以重命名列,并更新所有引用的新名称。

从SQL提示7文档:

SQL提示可以创建一个脚本,可以让你在不破坏依赖重命名数据库对象。您可以重命名如下:

  • 表(包括列)

  • 浏览次数(包括列)

  • 存储过程(包括参数)

  • 功能(包括参数)

重命名对象时:

  • SQL提示还会修改引用重名对象或被重命名对象引用的所有对象,以确保依赖关系链接不会中断。

如果您之前已经更名为使用SQL Server Management Studio或企业管理器重新命名,或T-SQL命令sp_rename一个对象,该对象定义将包含原来的名称。

任何引用此原始名称的对象都不会更新。

为帮助您查找引用不再存在的对象的对象,请参阅查找无效对象。

  • 原始权限和对象的扩展属性被保留。
相关问题