Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server sp_refreshView在发生sp_重命名时替换视图实现_Sql Server_Tsql - Fatal编程技术网

Sql server sp_refreshView在发生sp_重命名时替换视图实现

Sql server sp_refreshView在发生sp_重命名时替换视图实现,sql-server,tsql,Sql Server,Tsql,我有一个非常奇怪的观点,我可以复制。我很确定某些视图元数据不是最新的,并导致此问题 简言之: 我有一个视图(MyTestView) 此视图已重命名(MyTestViewOld) 将使用重命名视图的原始名称和不同的选择查询(MyTestView)创建一个新视图 在重命名的视图(MyTestViewOld)上执行sp_refreshview 现在MyTestView的实现是MyTestViewOld的实现 我尝试查看SP SP_refreshview,但他只是执行了另一个名为SP_refresh

我有一个非常奇怪的观点,我可以复制。我很确定某些视图元数据不是最新的,并导致此问题

简言之:

  • 我有一个视图(MyTestView)
  • 此视图已重命名(MyTestViewOld)
  • 将使用重命名视图的原始名称和不同的选择查询(MyTestView)创建一个新视图
  • 在重命名的视图(MyTestViewOld)上执行sp_refreshview
  • 现在MyTestView的实现是MyTestViewOld的实现
我尝试查看SP SP_refreshview,但他只是执行了另一个名为SP_refreshsqlmodule_internal的SP。我在主数据库的系统存储过程中没有看到此视图:(

通过删除“MyTestViewOld”我的问题实际上得到了解决,但我想知道到底发生了什么!Tnx

这里是重现问题的脚本!(请按步骤执行)

是相当不完善的,并且在大多数对象类型上都有很多关于使用它的警告:

更改对象名称的任何部分都可能会中断脚本和存储过程。我们建议您不要使用此语句重命名存储过程、触发器、用户定义函数或视图;相反,请删除对象并使用新名称重新创建它

虽然没有关于您发现的场景的具体警告,但有一些线索可以说明导致出现问题的潜在路径:

重命名存储过程、函数、视图或触发器不会更改
sys.sql\u modules
目录视图的“定义”列中相应对象名称的名称

而且,正如您所发现的,刷新视图的内部方法是
sp\u refreshsqlmodule\u internal
——因此我建议这是“模块”级元数据内部的某种形式的缺陷


您可能想考虑将问题提出来,如果没有其他原因,而不是其他地方记录的bug,并且(也许)他们会对产品文档添加进一步的警告。

也遇到了这个问题。我使用下面的查询来标识数据库中可能引起问题的任何视图:

select * from (
SELECT o.object_id, o.name, 
Replace(Replace(Replace(SUBSTRING(m.definition,13,(CHARINDEX(CHAR(13),m.definition + CHAR(13)))-13),'[',''),']',''),'dbo.','') as definitionName
FROM sys.objects AS o
left join sys.sql_modules AS m on o.object_id = m.object_id
where o.type='v' )x
where name != definitionName

:“更改对象名称的任何部分都可能中断脚本和存储过程。建议您不要使用此语句重命名存储过程、触发器、用户定义函数或视图;而是删除对象并使用新名称重新创建它。”@deblendewim-很有趣,但是没有真正的理由在视图上调用sp_rename,只需删除并重新创建即可。我完全按照您的说法执行!甚至管理工作室也警告我此操作:“警告:更改对象名称的任何部分都可能会破坏脚本和存储过程。”.但这仍然不能回答我的问题:到底发生了什么?也许我的问题太牵强了,因为它发生在内部SQL Server的大脑中:)好吧,我链接到的页面中的另一句话是重命名存储过程、函数、视图或触发器不会更改sys.sql_modules目录视图的definition列中相应对象名称的名称“这可能开始给我们一个线索,但我认为在那之后,它的内部结构变得模糊,我们无法访问它。@Damien_不信者:你能在回答中添加你的第一个和最后一个评论吗?”?那么这个问题就可以回答了。。。我需要继续我的开发工作,不要再担心这个了:D
select * from (
SELECT o.object_id, o.name, 
Replace(Replace(Replace(SUBSTRING(m.definition,13,(CHARINDEX(CHAR(13),m.definition + CHAR(13)))-13),'[',''),']',''),'dbo.','') as definitionName
FROM sys.objects AS o
left join sys.sql_modules AS m on o.object_id = m.object_id
where o.type='v' )x
where name != definitionName