我在'master'数据库而不是临时数据库中偶然使用了这个脚本。
sp_msforeachtable 'delete from ?'
它是否造成了伤害?如果是这样,我该如何恢复数据呢?
答案 0 :(得分:10)
不,它不应该删除任何内容(假设master
中没有用户表)。
测试
exec sys.sp_MSforeachtable 'select ''?'''
不为我退货。因此它似乎排除了spt_values
等系统表。
编辑:确实在查看过程的定义时,它只包含OBJECTPROPERTY(o.id, N'IsUserTable') = 1
答案 1 :(得分:5)
Martin Smith说sp_MSforeachtable
不删除系统表是对的。
但是,尽管我们可能会将spt_values
和MSreplication_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数据库中,这也会返回一个空的结果集。