【问题标题】:SQL Server 2008 - sp_refreshview bombing out on some viewsSQL Server 2008 - sp_refreshview 在某些视图上轰炸
【发布时间】:2011-09-21 13:42:35
【问题描述】:

我继承了一个相当大的项目,该项目广泛使用 SQL Server(2005 和 2008)视图。

构建过程中的一个步骤是调用sp_refreshviews 系统存储过程,以确保对任何表的更改都不会破坏我们的视图。这很好用....除了大约三四个(超过 200 个)视图....

有了这些,它就会爆炸 - 给出奇怪的错误消息,例如

消息 15165,级别 16,状态 1, 程序 sp_refreshsqlmodule_internal,第 55 行
找不到对象 'vYourViewNameHere' 或者你没有 有权限。

这是大错特错 - 视图确实存在,我绝对可以从中选择。

我似乎找不到任何关于为什么会发生这种情况的简洁信息,是什么触发了它......有什么想法吗?我能做些什么来检测这些有问题的观点吗?我可以更改它们的定义,以便它们可以再次刷新吗?

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

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

【问题讨论】:

  • Connect item与您的情况有关吗?
  • @Joe Stefanelli:试过了 - 结果相同 :-( 我放弃了其中一个问题视图,并使用适当的显式模式重新创建了它 - 仍然不喜欢刷新.. ..
  • sp_refreshview 需要更改相关视图的权限。您提到您可以从中进行选择,但您可以使用运行 sp_refreshview 的相同日志来修改单个视图吗?

标签: sql-server views


【解决方案1】:

我在您提到的 cmets 中注意到它具有 SCHEMABINDING。我几乎可以保证这是问题所在。 Books online 明确表示这是用于非模式绑定视图。

方案绑定视图不允许发生重大更改,因此无需更新元数据。您可以放心地跳过它。

您可以像这样识别所有模式绑定视图:

SELECT * FROM sys.views WHERE OBJECTPROPERTY(object_id, 'IsSchemaBound')=1

【讨论】:

  • 是的,它是.....我一直认为这会阻止任何基础表发生变化 - 从来没有想过这会导致sp_refreshview 系统存储过程在这些视图上失败.. ...
  • 我有点惊讶它自己抛出了一个错误。你会认为它会忽略它。
  • 是的,确实......只需跳过那些刷新时带有WITH SCHEMABINDING 的视图,因为它们自己已经确保没有任何变化......加上错误消息真的很神秘,而且误导,太......
【解决方案2】:

我在使用 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

【讨论】:

  • 我有一个客户端在 SQL 2008R2 实例上遇到了这个问题。这似乎是问题所在,但是,在 SQL 2014 上运行上述代码不会产生此错误。这个问题有可能解决了吗?
【解决方案3】:

我这个错误的化身是:

消息 8116,级别 16,状态 1,过程 sp_refreshsqlmodule_internal, 第 75 行参数数据类型 int 对子字符串的参数 1 无效 功能。

在 db 脚本的不同位置都报告了此错误消息。我会说错误的地方。如果我将报告此错误的 SQL 注释掉,其他地方也会报告相同的错误。

我在脚本中注释掉了以下调用作为解决方法,脚本将成功完成。

-- EXECUTE sp_refreshview @viewName;

注意:在运行 RThomas 的相邻答案 https://stackoverflow.com/a/6460532/179972 中建议的查询时,我的数据库没有报告具有架构绑定视图

更新 - 解决方案:

在我们的数据库脚本成功运行并注释掉sp_refreshview 命令(如上所示)后,我们自己运行视图刷新代码,它也成功了。

--
这个答案对我来说没有意义,因为它能够成功地工作,但是我已经在这里记录它以防它被证明对其他人有帮助。

【讨论】:

    【解决方案4】:

    要查找哪个视图是您的问题,请在正常的 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-15
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 2012-03-25
      相关资源
      最近更新 更多