在我的测试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?
答案 0 :(得分:1)
好的,经过一些小小的讨论,我找到了解决方案..
表sys.spt_values位于ressources数据库(mssqlsystemresource)中。只有在单用户模式下启动SQL服务时,才能访问此数据库。
要重新创建视图,我必须执行以下步骤:
2.以单用户模式启动SQL Service
打开DOS命令提示符并使用开关-m
sqlservr.exe -sSQLT01 –m
只需连接查询窗口,但不能连接对象资源管理器窗口。该服务只接受一个连接!如果出现问题,您可以在运行服务的DOS窗口中看到它。
当我在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%'
现在应该显示一个视图
只是为了它的乐趣...你现在可以查询表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:驱动器上的默认位置。