如果我们想将MyColumnName
的名称更改为MyAlteredColumnName
...
...我们有一个SQL Server 2008表,如下所示:
MyTable
MyColumnName
以及引用基础列的视图:
CREATE VIEW MyDependentView WITH SCHEMABINDING
AS
SELECT ..., MyTable.MyColumnName
我们最终遵循此程序:
我们使用migrator dot net执行此操作。
有更好的方法吗?是否有T-SQL会改变视图列名?或者SQL Server 2008中是否支持将列自动捆绑在一起?
答案 0 :(得分:5)
如果不使用第三方工具,这是执行此操作的唯一方法之一。显然,您也可以使用ALTER VIEW而不是DROP和CREATE。
应该注意的是,Red-Gate创建了一个名为SQL Refactor的工具,它将自动进行这种改变(不,我不为它们工作)。我确信还有其他类似的数据库重构工具。
答案 1 :(得分:2)
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,这里是操作指南