我在'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
马丁史密斯是正确的说,sp_MSforeachtable不删除系统表.
然而,尽管我们可以把表,如spt_values和MSreplication_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数据库中,这也返回一个空结果集.
| 归档时间: |
|
| 查看次数: |
1362 次 |
| 最近记录: |