如何重命名一个已损坏的视图
我有如下的表和视图:
create table t_dummy (i int, z varchar(30))
go
create view vw_t_dummy
as
select i, z
from t_dummy
go
现在假设我们从表中删除一列,这样视图就会出问题。
alter table t_dummy drop column z
SSMS可以把视图重命名为 z_vw_t_dummy,一切都会正确,但在脚本中该如何实现?
- 如果我使用
sp_rename,它不会修正定义文本中的视图名称 - 如果我尝试用一个新名字创建视图,会得到一个错误
Msg 207, Level 16, State 1, Procedure z_vw_t_dummy, Line 3 [Batch Start Line 18]
无效的列名 'z'
那么,SSMS是怎么做到的?
解决方案
SSMS基本上在后台执行一个 sp_rename。这在损坏的视图上也能工作,因为它只是更新 sys.objects 中的名称,而不对主体进行验证。
EXEC sp_rename 'dbo.vw_t_dummy', 'z_vw_t_dummy';
问题在于 sp_rename 不会触及视图定义(正如你所注意的),所以重命名后你仍然需要用 ALTER VIEW 来修正它:
ALTER VIEW dbo.z_vw_t_dummy AS
SELECT i
FROM t_dummy;
GO
你的 CREATE VIEW 可能失败,是因为SELECT仍然引用被删除的列 z,不是因为重命名本身。如果你只想要一个干净的切断,你也可以删除损坏的视图并用新名字重新创建它。无论哪种方式,你都需要更新列列表。
希望这能帮到你!
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。