SQL服务器2014:重新创建系统视图master.dbo.spt_values

问题描述 投票:1回答:2

在我的测试的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年数据库的性能,得到了以下错误:

Invalid object name 'master.dbo.spt_values'

经过一番搜索,我发现我可以重新创建脚本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获取其数据?

sql-server-2014
2个回答
1
投票

好了,有些摸索之后,我找到了解决办法..

该表sys.spt_values在ressources数据库(mssqlsystemresource)。当SQL服务在单用户模式下启动该数据库时,才可访问..

要重新创建我不得不做以下步骤的观点:

  1. 停止所有SQL服务 stop sql services

2.在单用户模式启动SQL服务 打开一个DOS命令提示符,并开始与开关-m的sqlservice

sqlservr.exe -sSQLT01 –m

  1. SSMS连接到该实例

只需连接查询窗口,而不是在对象资源管理器窗口。该服务只接受一个单一的连接!如果有问题,你可以看到它在服务运行在DOS窗口。

  1. 删除错误的表spt_values

当我创建的主数据库中的表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%'

它现在应该显示一个视图

  1. 查询视图dbo.spt_values和表sys.spt_values

只是它的乐趣......现在,您可以查询该表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服务。或者你只是重新启动整个服务器

希望这篇文章可以帮助其他人在未来


0
投票

该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年:驱动器。

© www.soinside.com 2019 - 2024. All rights reserved.