无意中删除了"主"数据库中的所有数据

use*_*702 7 sql-server-2008

我在'master'数据库而不是temp数据库上偶然使用了这个脚本.

sp_msforeachtable 'delete from ?'
Run Code Online (Sandbox Code Playgroud)

它有什么危害吗?如果是这样,我该如何恢复数据?

Mar*_*ith 10

不,它不应该删除任何东西(假设你没有用户表master).

测试

exec sys.sp_MSforeachtable 'select ''?'''
Run Code Online (Sandbox Code Playgroud)

不给我任何回报.所以它似乎排除了系统表,如spt_values.

编辑:确实看一下程序的定义,它只包含表格 OBJECTPROPERTY(o.id, N'IsUserTable') = 1


Iai*_*der 5

马丁史密斯是正确的说,sp_MSforeachtable不删除系统表.

然而,尽管我们可以把表,如spt_valuesMSreplication_options系统表,它们实际上是用户表,根据到SQL Server.

当我在master数据库中运行此查询时:

SELECT name, OBJECTPROPERTY(object_id, N'IsUserTable') AS IsUserTable
FROM master.sys.tables;
Run Code Online (Sandbox Code Playgroud)

我看到以下结果集:

name                  IsUserTable
--------------------- -----------
spt_fallback_db       1
spt_fallback_dev      1
spt_fallback_usg      1
spt_monitor           1
MSreplication_options 1
Run Code Online (Sandbox Code Playgroud)

那么Stijn如何从重新安装中获救?

如果你看看如何sp_MSforeachtable实现,你会看到它做这样的事情来选择要删除的表:

declare @mscat nvarchar(12)
select @mscat = ltrim(str(convert(int, 0x0002)))

SELECT *
from dbo.sysobjects o join sys.all_objects syso on o.id = syso.object_id 
where OBJECTPROPERTY(o.id, N'IsUserTable') = 1 and o.category & @mscat = 0;
Run Code Online (Sandbox Code Playgroud)

在我的master数据库中,这将返回一个空结果集.

where子句将位掩码应用于category表的列sysobjects以排除不是' mscat'的表.

因此,master数据库中的表不受保护,不是因为它们是系统表,而是因为它们是"Microsoft"表.

联机丛书中,类别列的使用完全没有记录.它只是一个模糊的描述:

用于发布,约束和标识.

sysobjects无论如何,该表已被弃用,因此您不应该使用它.:)

使用受支持的视图的等效查询sys.tables如下所示:

SELECT *
FROM sys.tables
WHERE is_ms_shipped = 0;
Run Code Online (Sandbox Code Playgroud)

在我的master数据库中,这也返回一个空结果集.