【问题标题】:SQL Server 2014: Re-Create System view master.dbo.spt_valuesSQL Server 2014:重新创建系统视图 master.dbo.spt_values
【发布时间】:2017-04-06 12:36:44
【问题描述】:

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

【问题讨论】:

    标签: sql-server-2014


    【解决方案1】:

    好的,经过一番折腾,我找到了解决方案..

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

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

    1. 停止所有 SQL 服务


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

    sqlservr.exe -sSQLT01 –m
    


    1. 将 SSMS 连接到实例

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

    1. 删除错误的表 spt_values

    由于我在 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

    只是为了好玩...您现在可以查询 ressources 数据库中的表 sys.spt_values

    use mssqlsystemresource
    Select * from sys.spt_values
    


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

    use master
    Select * from dbo.spt_values
    


    8. 重启服务

    您现在可以在 SQL 服务运行时退出 DOS 窗口并启动 SQL 服务。或者你只是重新启动整个服务器

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

    【讨论】:

      【解决方案2】:

      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: 驱动器的默认位置。

      【讨论】:

      • 嘿@Tim,感谢您的回答。 u_tables.sql 的问题在于,它在主数据库中创建表和视图。但是,全新安装在 master 数据库中没有 spt_values 表,而只有在 mssqlsystemresource 数据库中。运行 u_tables.sql 后,您在 masters 数据库中有一个表。在运行脚本的主数据库上运行 select [name] , [type], [type_desc], * from sys.objects where name like 'spt_v%'并将其与干净的安装进行比较。它应该显示出不同
      • @DanSerf,说得好。我应该说这个“答案”不应该在服务器上使用。我的安装是在一个独立的开发盒上。仅当您只需要在您的开发机器上安装一个快速补丁以让您重新开始工作时才使用此选项。微妙的问题可能仍然存在,但我一直在编写代码。
      猜你喜欢
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 2016-07-13
      • 1970-01-01
      • 1970-01-01
      • 2013-09-06
      • 1970-01-01
      相关资源
      最近更新 更多