SQL Server 2008 - sp_refreshview轰炸一些视图

mar*_*c_s 12 sql-server views

我继承了一个相当重要的项目,它广泛使用SQL Server(2005和2008)视图.

构建过程的一个步骤是调用sp_refreshviews系统存储过程,以确保没有任何表的更改破坏了我们的视图.这工作正常....除了大约三或四(200+)视图....

有了这些,它只是炸弹 - 给出奇怪的错误信息,如

消息15165,级别16,状态1,过程sp_refreshsqlmodule_internal,行55
无法找到对象'vYourViewNameHere'或您没有权限.

这是错误的 - 这种观点确实存在,我绝对可以从中进行选择.

我似乎无法找到任何关于为什么会发生这种情况的简明信息,触发它的原因......任何想法?我能做些什么来发现这些有问题的观点吗?我可以更改他们的definitino,以便他们可以再次刷新吗?

更新:我在Microsoft Connect上记录了一个错误报告 - 如果您同意这看起来很奇怪并且需要修复,请投票支持!

https://connect.microsoft.com/SQLServer/feedback/details/676728/sp-refreshview-crashes-with-misleading-error-on-views-with-schemabinding

RTh*_*mas 15

我在评论中注意到你提到它有SCHEMABINDING.我几乎可以保证这就是问题所在.在线书籍明确表示这适用于非架构绑定视图.

方案绑定视图不允许发生重大更改,因此更新元数据是不必要的.你可以放心地跳过它.

您可以识别所有模式绑定视图,如下所示:

SELECT * FROM sys.views WHERE OBJECTPROPERTY(object_id, 'IsSchemaBound')=1
Run Code Online (Sandbox Code Playgroud)


小智 5

使用sp_helptext时遇到相同的错误。在我的情况下,原因是使用sp_rename重命名视图。下面的代码重现此错误。

create view demo as select dummy = 1
go

exec sp_rename 'demo', 'new_demo'
go

exec sp_refreshview 'new_demo'
go
Run Code Online (Sandbox Code Playgroud)

唯一的解决方案是手动更改视图。将此修复程序应用于上述解决方案,您将获得:

create view demo as select dummy = 1
go

exec sp_rename 'demo', 'new_demo'
go

-- This statement fixes the problem
alter view new_demo as select dummy = 1
go

exec sp_refreshview 'new_demo'
go
Run Code Online (Sandbox Code Playgroud)