SQL Server 2014:重新创建系统视图master.dbo.spt_values

时间:2017-04-06 12:36:44

标签: sql-server-2014

在我的测试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?

2 个答案:

答案 0 :(得分:1)

好的,经过一些小小的讨论,我找到了解决方案..

表sys.spt_values位于ressources数据库(mssqlsystemresource)中。只有在单用户模式下启动SQL服务时,才能访问此数据库。

要重新创建视图,我必须执行以下步骤:

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

  2.  2.以单用户模式启动SQL Service
    打开DOS命令提示符并使用开关-m

    启动sqlservice
    sqlservr.exe -sSQLT01 –m
    


    1. 将SSMS连接到实例
    2. 只需连接查询窗口,但不能连接对象资源管理器窗口。该服务只接受一个连接!如果出现问题,您可以在运行服务的DOS窗口中看到它。

      1. 删除错误的表spt_values
      2. 当我在master数据库上创建表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
        2. 只是为了它的乐趣...你现在可以查询表sys.spt_values,它位于资源数据库中

          use mssqlsystemresource
          Select * from sys.spt_values
          


          您可以查询主数据库中的视图dbo.spt_values

          use master
          Select * from dbo.spt_values
          


           8.重新启动服务

          现在可以在运行SQL Service的情况下退出DOS窗口并启动SQL Services。或者您只需重新启动整个服务器

          希望这篇文章将来会帮助其他人

答案 1 :(得分:0)

u_tables.sql脚本将创建master.dbo.spt_values,但是我必须使用专用管理员连接(DAC)来运行它。

解决方案: 步骤1:以管理员身份打开命令提示符

第2步:运行以下命令: sqlcmd -S -U sa -P -A -i“ C:\ Program Files \ Microsoft SQL Server \ MSSQL14.SQL2017 \ MSSQL \ Install \ u_tables.sql”

交换出您的值。如果您没有sa的密码,则需要找到一个具有足够权限的用户(并用您的用户名替换“ sa”)。

-A将命令作为DAC运行。应该谨慎使用。请参阅DAC上的MS文档。

在安装目录中找到u_tables.sql文件。上面的路径是我在装有SQL 2017的计算机上的位置,该位置位于C:驱动器上的默认位置。