重命名表列并将其传播到从属视图

时间:2010-08-28 02:58:55

标签: sql sql-server

如果我们想将MyColumnName的名称更改为MyAlteredColumnName ...

...我们有一个SQL Server 2008表,如下所示:

MyTable
  MyColumnName

以及引用基础列的视图:

CREATE VIEW MyDependentView WITH SCHEMABINDING
AS
SELECT ..., MyTable.MyColumnName

我们最终遵循此程序:

  1. 删除视图
  2. 将MyTable.MyColumnName更改为MyTable.MyAlteredColumnName
  3. 使用对MyAlteredColumnName的引用重新创建视图
  4. 我们使用migrator dot net执行此操作。

    有更好的方法吗?是否有T-SQL会改变视图列名?或者SQL Server 2008中是否支持将列自动捆绑在一起?

4 个答案:

答案 0 :(得分:5)

如果不使用第三方工具,这是执行此操作的唯一方法之一。显然,您也可以使用ALTER VIEW而不是DROP和CREATE。

应该注意的是,Red-Gate创建了一个名为SQL Refactor的工具,它将自动进行这种改变(不,我不为它们工作)。我确信还有其他类似的数据库重构工具。

答案 1 :(得分:2)

使用sp_refreshview

EXEC sp_refreshview @viewName

如果要刷新所有视图,则必须迭代它们的循环,这意味着动态SQL。

如果你将它们分层(一个视图依赖于另一个视图 - 坏),你必须先刷新父视图......

答案 2 :(得分:2)

如果是SELECT *视图,您可以像OMG_Ponies建议的那样调用sp_refreshview。它将重新编译视图并适当地更新列元数据。如果在一致的计划中适当使用,这是明智地使用SELECT *可能带来好处的一个领域。

否则,您必须重新定义视图。对旧列名称的任何显式引用现在都会引发错误。

啊,还有一个选择:

EXEC sp_rename 'MyTable.MyColumnName', 'MyAlteredColumnName'
ALTER TABLE MyTable ADD MyColumnName AS MyAlteredColumnName
EXEC sp_rename 'MyView.MyColumnName', 'MyAlteredColumnName'

这是一个黑客,它很危险,因为存储的视图定义现在将与视图元数据不同步。你已经用多余的计算列填充了数据库。

但是它会起作用(直到你忘记你做了什么,或者其他人必须维护系统,事情开始神秘地破裂)。

答案 3 :(得分:0)

我使用第三方工具,它还没有让我失望。它是ApexSQL Refactor,这里是操作指南

How to rename a column without breaking your SQL database