代码之家  ›  专栏  ›  技术社区  ›  Rob

重命名表列并将其传播到依赖视图

  •  3
  • Rob  · 技术社区  · 14 年前

    如果我们想更改 MyColumnName MyAlteredColumnName

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

    MyTable
      MyColumnName
    

    以及引用基础列的视图:

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

    我们最终遵循以下步骤:

    1. 删除视图
    2. 将myTable.myColumn名称更改为myTable.myAlteredColumn名称
    3. 使用对myalteredcolumnname的引用重新创建视图

    我们使用migrator dot net执行此操作。

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

    4 回复  |  直到 11 年前
        1
  •  5
  •   Thomas    14 年前

    如果不使用第三方工具,这是唯一的方法之一。显然,您也可以使用alter-view而不是drop-and-create。

    应该注意的是,红门制造了一个叫做 SQL Refactor 这将使这种变化自动化(不,我不为他们工作)。我确信还有其他类似的数据库重构工具。

        2
  •  2
  •   OMG Ponies    14 年前

    使用 sp_refreshview :

    EXEC sp_refreshview @viewName
    

    如果要刷新所有视图,则必须循环访问这些视图,这意味着动态SQL。

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

        3
  •  2
  •   Peter Radocchia    14 年前

    如果是 SELECT * 视图,您可以调用sp_refreshview,正如omg_ponies建议的那样。它将重新编译视图并适当地更新列元数据。这是一个明智使用 选择* 如果在一致的方案中适当地使用,可能会有好处。

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

    啊,还有一个选择:

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

    这是一个黑客行为,而且很危险,因为存储的视图定义现在将与视图元数据不同步。你已经把数据库中多余的计算列乱丢了。

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

        4
  •  0
  •   Carol Baker West    11 年前

    我用第三方工具来做这个,它还没有让我失败。这是apexsql重构,下面是操作指南

    How to rename a column without breaking your SQL database