在我的测试的SQL Server 2014安装,我被“清洗”的主数据库。
用下面的命令,我被检查其用户对象主要有:
SELECT
'DROP ' +
CASE
WHEN [sys].[all_objects].type IN ('AF','FN','FS','FT','IF','TF') THEN 'FUNCTION '
WHEN [sys].[all_objects].type IN ('D','C','F','PK','UQ') THEN 'CONSTRAINT '
WHEN [sys].[all_objects].type IN ('IT','S','U') THEN 'TABLE '
WHEN [sys].[all_objects].type IN ('P','PC','RF','X') THEN 'PROCEDURE '
WHEN [sys].[all_objects].type IN ('TA','TR') THEN 'TRIGGER '
WHEN [sys].[all_objects].type = 'R' THEN 'RULE '
WHEN [sys].[all_objects].type = 'SN' THEN 'SYNONYM '
WHEN [sys].[all_objects].type = 'TT' THEN 'TYPE '
WHEN [sys].[all_objects].type = 'V' THEN 'VIEW '
END +
SCHEMA_NAME(sys.[all_objects].[schema_id]) + '.' + OBJECT_NAME(object_id) + '; ' as [Command],
OBJECT_NAME(object_id) as [ObjectName],
[sys].[all_objects].[type_desc] as [TypeDesc],
[sys].[all_objects].[type] as [Type],
SCHEMA_NAME(sys.[all_objects].[schema_id]) as [Schema]
FROM
sys.[all_objects] WITH (NOLOCK)
WHERE SCHEMA_NAME(sys.[all_objects].[schema_id]) like '%dbo%'
结果之一是认为spt_values。
Command | ObjectName | TypeDesc | Type | Schema
------------------------|------------|----_-----|------|-------
DROP VIEW dbo.spt_values; spt_values VIEW V dbo
因为这不是我认识的一个观点,我删除了(与其他对象一起)。
当天晚些时候,我想检查在SSMS 2016年数据库的性能,得到了以下错误:
经过一番搜索,我发现我可以重新创建脚本u_tables.sql缺少的观点(这是在SQL Server安装文件夹的服务器上)。信息从这里:https://ashishgilhotra.wordpress.com/tag/u_tables-sql/
该脚本创建视图的代码如下:
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
EXEC sp_MS_marksystemobject 'spt_values'
go
grant select on spt_values to public
go
已经在代码看时,我怀疑这是可行的,因为没有任何地方可以找到sys.spt_values表。
正如预期的那样出现错误
Msg 208, Level 16, State 1, Procedure spt_values, Line 6
Invalid object name 'sys.spt_values'.
在我与它的SQL Server 2008服务器等,有一个表master.dbo.spt_values(但无图)!
经过一番搜索多,我发现我可以创建一个表具有相同名称的链接..这里https://www.mssqltips.com/sqlservertip/3694/fix-invalid-object-name-masterdbosptvalues-when-viewing-sql-server-database-properties/
现在,我创建一个值的表从另一个SQL Server 2014安装,一切似乎都可以正常工作了。
但是,这是不正确的!
当我检查新创建的对象在测试服务器上使用这个命令
select [name] , [type], [type_desc]
from sys.objects
where name like 'spt_v%'
它显示了一个USER_TABLE对象。在我的另一台服务器,它显示了一个观点...
所以,我的问题是:我怎样才能创建视图spt_values从表spt_values获取其数据?
好了,有些摸索之后,我找到了解决办法..
该表sys.spt_values在ressources数据库(mssqlsystemresource)。当SQL服务在单用户模式下启动该数据库时,才可访问..
要重新创建我不得不做以下步骤的观点:
2.在单用户模式启动SQL服务 打开一个DOS命令提示符,并开始与开关-m的sqlservice
sqlservr.exe -sSQLT01 –m
只需连接查询窗口,而不是在对象资源管理器窗口。该服务只接受一个单一的连接!如果有问题,你可以看到它在服务运行在DOS窗口。
当我创建的主数据库中的表spt_values,我必须先删除
use master
go
drop table dbo.spt_values
5.创建视图 现在,我终于可以创建视图dbo.spt_values,它指向表sys.spt_values
use master
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
EXEC sp_MS_marksystemobject 'spt_values'
go
grant select on spt_values to public
go
6.检查对象dbo.spt_values
use master
select schema_name(schema_id), object_id('spt_values'), *
from sys.objects
where name like 'spt_v%'
它现在应该显示一个视图
只是它的乐趣......现在,您可以查询该表sys.spt_values,这是在ressources数据库
use mssqlsystemresource
Select * from sys.spt_values
你可以查询视图dbo.spt_values,这是在主数据库
use master
Select * from dbo.spt_values
8.重新启动服务
现在,您可以退出与SQL服务的DOS窗口中运行并启动SQL服务。或者你只是重新启动整个服务器
希望这篇文章可以帮助其他人在未来
该u_tables.sql脚本将创建master.dbo.spt_values,但我不得不与专用管理员连接(DAC)上运行。
解决方法:步骤1:打开命令提示符作为管理员
第2步:运行以下命令:SQLCMD -S -U -P SA -A -i “C:\ Program Files文件\ Microsoft SQL Server的\ MSSQL14.SQL2017 \ MSSQL \安装\ u_tables.sql”
换出,并与你的价值观。如果你没有送的,你需要找到具有足够权限的用户的密码(和替换“山”与您的用户名)。
该-A运行命令的DAC。这应谨慎使用。看到在DAC MS文档。
找到你的安装目录中的文件u_tables.sql。上面的路径是它是我的机器上安装的在C的默认位置SQL 2017年:驱动器。