问题描述
||
我继承了一个相当大的项目,该项目大量使用了sql Server(2005和2008)视图。
生成过程的第一步是调用ѭ0系统存储过程,以确保没有对任何表的更改破坏我们的视图。除了大约三到四个(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
解决方法
我在您提及的评论中注意到它具有SCHEMABINDING。我几乎可以保证这就是问题所在。在线书籍特别指出,这是用于非架构绑定的视图。
受限于方案的视图将不允许进行重大更改,因此不需要更新元数据。您可以安全地跳过它。
您可以像这样标识所有已绑定架构的视图:
SELECT * FROM sys.views WHERE OBJECTPROPERTY(object_id,\'IsSchemaBound\')=1
, 使用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
唯一的解决方案是手动更改视图。将此修复程序应用于上述解决方案,您将获得:
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
, 这个错误的体现是:
消息8116,级别16,状态1,过程sp_refreshsqlmodule_internal,
第75行的参数数据类型int对于子字符串的参数1无效
功能。
db脚本中的各个位置都报告了此错误消息。我会说错地方。如果我注释掉该SQL,则会报告此错误,其他地方也会报告该错误。
我将脚本中的以下调用注释为一种解决方法,该脚本将成功完成。
-- EXECUTE sp_refreshview @viewName;
注意:运行RThomas的相邻答案https://stackoverflow.com/a/6460532/179972中建议的查询时,我的数据库未报告具有架构绑定视图
更新-解决方案:
成功注释掉sp_refreshview
命令后,数据库脚本成功运行(如上所示),然后我们自己运行视图刷新代码,它也成功。
-
对于它如何成功工作,这个答案对我而言没有任何意义,但是,如果对其他人有帮助,我会在此处进行记录。
, 要查找哪个视图是您的问题,请在普通的sppRefreshViews中添加打印件。这里没有什么土崩瓦解,但我想我会分享。
CREATE procedure sppRefreshViews2
as
declare @t varchar (1024)
declare tbl_cur cursor for
select TABLE_NAME from INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = \'VIEW\' and table_name like \'sp%\'
OPEN tbl_cur
FETCH NEXT from tbl_cur INTO @t
WHILE @@FETCH_STATUS = 0
BEGIN
print @t
exec (\'sp_refreshview \'\'\' + @t + \'\'\'\')
FETCH NEXT from tbl_cur INTO @t
END
CLOSE tbl_cur
DEALLOCATE tbl_Cur