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

时间:2011-12-20 14:21:14

标签: sql-server-2008

我在'master'数据库而不是临时数据库中偶然使用了这个脚本。

sp_msforeachtable 'delete from ?'

它是否造成了伤害?如果是这样,我该如何恢复数据呢?

2 个答案:

答案 0 :(得分:10)

不,它不应该删除任何内容(假设master中没有用户表)。

测试

exec sys.sp_MSforeachtable 'select ''?'''

不为我退货。因此它似乎排除了spt_values等系统表。

编辑:确实在查看过程的定义时,它只包含OBJECTPROPERTY(o.id, N'IsUserTable') = 1

的表格

答案 1 :(得分:5)

Martin Smith说sp_MSforeachtable不删除系统表是对的。

但是,尽管我们可能会将spt_valuesMSreplication_options等表视为系统表,但它们实际上是根据SQL Server的用户表。

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

SELECT name, OBJECTPROPERTY(object_id, N'IsUserTable') AS IsUserTable
FROM master.sys.tables;

我看到以下结果集:

name                  IsUserTable
--------------------- -----------
spt_fallback_db       1
spt_fallback_dev      1
spt_fallback_usg      1
spt_monitor           1
MSreplication_options 1

那么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;

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

where子句将位掩码应用于表category的{​​{1}}列,以排除不是“sysobjects”的表。

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

类别列的使用在Books Online中完全没有记录。它只是一个模糊的描述:

  

用于发布,约束和身份。

但是mscat表仍然被弃用,所以你不应该使用它。 :)

使用支持的视图sysobjects的等效查询如下所示:

sys.tables

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