关于系统表的修复脚本u_tables.sql

[复制链接]
查看11 | 回复1 | 2017-5-8 10:50:44 | 显示全部楼层 |阅读模式
今天早上突然发现,某个2008R2测试库无法在图形界面右键数据库查看属性,报错如下:
对象名‘master.dbo.spt_values’无效。(错误:208)
到系统表和视图中查看发现spt_values确实不存在。
于是果断Google发现解决答案基本都是执行sqlserver自带的u_tables.sql脚本,于是找到脚本执行之,但是报错:spt_values无效。
只能仔细去看u_tables.sql的内容,发现其内容如下:
use master
go
set nocount on
go

declare @vdt varchar(99)
select@vdt = convert(varchar,getdate(),113)
raiserror('Starting u_Tables.SQL at%s',0,1,@vdt) with nowait
raiserror('This file creates all the system tables in master.',0,1)
go
-- Create a synonym spt_values in master pointing to spt_master in Resource DB,
-- for backward compat
if object_id('spt_values','U') IS NOT NULL

begin

print 'drop table spt_values ....'

drop table spt_values

end
go
if object_id('spt_values','SN') IS NOT NULL

begin

print 'drop synonym spt_values ....'

drop synonym spt_values

end
go
if object_id('spt_values','V') IS NOT NULL

begin

print 'drop view spt_values ....'

drop view spt_values

end
go
raiserror('Creating view ''%s''.', -1,-1,'spt_values')
go
create view spt_values as
select name collate database_default as name,

number,

type collate database_default as type,

low, high, status
from sys.spt_values
go
......后边还有一堆类似的用于创建其他系统表。
这里发现脚本中将spt_values表给干掉了,然后基于这个表创建视图???显然会出现spt_values不存在的错误。
于是到一个正常的2008R2库中看发现此表是存在的,但一旦执行u_tables.sql的脚本这个表就会消失,不能查看属性的问题又会出现。那么问题来了!!!
1。这个脚本是不是微软故意放出来的坑!!说好的修复居然起到了直接把数据库图形界面废掉的功能!!
2。除了重建实例有其他办法解决问题吗?
回复

使用道具 举报

千问 | 2017-5-8 10:50:44 | 显示全部楼层
本帖最后由 LeoCp 于 2016-12-19 22:33 编辑
目前的尝试和结论:
1.2008R2上spt_values是一个系统表,正常的库执行u_tables.sql后也会变得不正常,缺失此表的话执行完毕也不会重建spt_values表或者视图,只能备份数据库然后重建实例了,好在出现这个问题只会影响图形界面查看属性,命令还是能执行的。
2.2012上spt_values是一个系统视图,不是系统表,执行u_table.sql之后正如脚本内容所写,也会被删掉出现类似错误。
暂时的结论:(有待继续深入)
1.千万不要相信u_tables.sql--尼玛啊,本人在3个测试库上实验的血泪后果,只能重建3个实例了,其中2个2008R2,一个2012。
2.出现spt_values的问题,如果必须要使用图形界面,只能备份数据库,重建实例,还原之。
PS:网络上还有一种重建master数据库的办法,然而重建之后所有数据库也会丢失,和重建实例的办法并无区别,放弃之。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行