文件组不能删除,因为它不是空的错误,没有文件

当我尝试删除“MYFILEGROUP”时,出现文件不能被删除的错误,因为它不是空的。 我已经删除了所有表,索引并删除了与该组相关联的所有文件。 为了validation我运行下面的脚本:

sp_helpfilegroup 

在“MYFILEGROUP”上为filecount返回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. 

这是预期的行为,还是表示系统表有问题? 如果这是一个问题,那么我将如何解决? 我从数据库中删除每个foriegn键,索引和约束,只留下表。 当我尝试删除空的“MYFILEGROUP”时,它仍然错误。

有没有可能MYFILEGROUP上有一个parition对象? 如果是这种情况,那么你使用的兼容性将不会返回任何结果(sql server 2000没有分区对象!)。 当checkdb检查一个已经分区的表/索引时,你得到的关于跳过对象检查的消息是2008年的预期行为,请参阅这篇博文 。 你有什么这个查询?

 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' 

如果使用文件组的表具有在该文件组上定义的统计信息,则会发生这种情况。 如果您运行此查询,并用您的文件组标识符replaceX,则可以知道是否有该文件组的任何悬挂统计信息:

 select object_name(id) AS TableName, * from dbo.sysindexes where groupid = X 

一旦你知道表名,你可以运行DROP STATISTICS,希望之后你应该能够删除文件组。

我脑海里的一些东西告诉我,你需要在删除文件和删除文件组之间做一个备份。 另外,当我这样做之前,我已经看到sys.database_files和sys.master_files之间的不匹配(即其中一个视图有文件,其他视图没有),但至less可以告诉你服务器仍然以某种身份了解该文件。 无论哪种方式,采取备份)或让你定期的一个发生),然后再次尝试删除文件组。