当我尝试删除“MYFILEGROUP”时,出现错误,提示无法删除文件组,因为它不为空。我已经删除了所有表、索引并删除了与该组相关的所有文件。为了验证,我运行了以下脚本:
sp_helpfilegroup
对‘MYFILEGROUP’的文件计数返回 0。
select o.name, s.groupname
from sysobjects o
join sysindexes i on o.id = i.id
join sysfilegroups s on i.groupid = s.groupid
where groupname = 'MYFILEGROUP'
不返回任何行...
我还有一些信息。当我运行
dbcc checkfilegroup('MYFILEGROUP')
结果列出了所有主键,并附有一条警告:
Cannot process rowset ID 72057597605511168 of object "TableName" (ID 2071414),
index "PK_TableName" (ID 1), because it resides on filegroup "PRIMARY" (ID 1),
which was not checked.
这是预期行为还是表明系统表存在问题?如果存在问题,我该如何修复?我从数据库中删除了所有外键、索引和约束,只留下表。当我尝试删除空的“MYFILEGROUP”时,仍然会出错。
答案1
MYFILEGROUP 上是否有分区对象?如果是这种情况,那么兼容性视图您的使用不会返回任何结果(sql server 2000 没有分区对象!)。您收到的有关跳过要检查的对象的消息是 2008 中 checkdb 检查分区表/索引时的预期行为,请参阅此博客文章。这个查询你能得到什么结果吗?
select * from sys.partitions p
inner join sys.allocation_units a on a.container_id = p.hobt_id
inner join sys.filegroups f on f.data_space_id = a.data_space_id
where f.name='myfilegroup'
答案2
如果使用该文件组的表在该文件组上定义了统计信息,则可能会发生这种情况。如果运行此查询并将 X 替换为您的文件组 ID,则可以判断该文件组是否有任何悬而未决的统计信息:
select object_name(id) AS TableName, * from dbo.sysindexes where groupid = X
一旦知道表名,您就可以运行 DROP STATISTICS,并且希望之后您能够删除文件组。
答案3
我脑子里有个声音告诉我,你需要在删除文件和删除文件组之间进行备份。另外,当我以前这样做时,我看到 sys.database_files 和 sys.master_files 之间不匹配(即其中一个视图中有文件,另一个没有),但至少这告诉你服务器在某种程度上仍然知道该文件。无论哪种方式,请进行备份(或让你定期安排的备份发生),然后再次尝试删除文件组。