SQL Server 2008:无法删除FileStream文件和文件组

时间:2010-02-15 23:11:29

标签: sql-server-2008 filestream

使用SQL Server 2008 SP1,我删除了唯一一个与其关联的文件流的表,但每次尝试执行以下操作时都会这样做:

alter database ConsumerMarketingStore删除文件CMS_JobInstanceFiles

alter database ConsumerMarketingStore删除文件组JobInstanceFiles

我得到以下异常:

Msg 5042,Level 16,State 10,Line 2 无法删除文件“CMS_JobInstanceFiles”,因为它不为空。 Msg 5042,Level 16,State 11,Line 3 无法删除文件组“JobInstanceFiles”,因为它不为空。

我如何摆脱文件流文件和文件组?谢谢!

5 个答案:

答案 0 :(得分:14)

确保您删除的表实际上是唯一使用该文件流文件的表:

select * 
from ConsumerMarketingStore.sys.tables t 
join ConsumerMarketingStore.sys.data_spaces ds 
 on t.filestream_data_space_id = ds.data_space_id 
 and ds.name = 'JobInstanceFiles'

上述查询的结果应为空。如果您有其他表与Filestream列并说您删除了列,表仍将使用Filestream文件。摆脱这种用法的方法是将表的Filestream文件组设置为NULL:

alter table t1 set (filestream_on = "NULL")

答案 1 :(得分:1)

您必须运行DBCC SHRINKFILE (CMS_JobInstanceFiles, EMPTYFILE)

这会将文件标记为“空”并允许将其删除。

当然,ALTER DATABASE没有提到这一点,但DBCC SHRINKFILE确实......显而易见,是吗?

答案 2 :(得分:0)

删除表后,垃圾收集器需要一段时间来清理数据。这可能是发生这种情况的原因。您可以通过发出CHECKPOINT来强制进行垃圾回收。

您可以通过转到Filestream数据容器来验证是否清除了FILESTREAM数据。如果删除FILESTREAM数据,则ALTER DATABASE dbname REMOVE FILE通常会成功。完成后,您可以发出ALTER DATABASE dbname REMOVE FILEGROUP

答案 3 :(得分:0)

@inam - 我的情况有点不同;我创建了第二个文件组并将聚集索引移动到它。此后,我删除了辅助文件组中的聚簇索引。之后我尝试删除文件组,但我一直收到错误,文件组不为空。

我看到一些其他帖子表示将数据移动到同一文件组中的另一个文件。这里的问题是我在文件组中只有一个文件,我想删除文件组和文件。

我想出的解决方法如下。 我将table1中的所有记录复制到table2中(从table1中选择* into table2)

然后我删除了table1;之后我能够删除filegroup2和  其中的数据文件。

最后我将table2重命名为table1。

答案 4 :(得分:0)

除了从表中删除FileStream列和FileStream属性外,我还需要将数据库恢复模式设置为Simple

ALTER DATABASE [MyDatabase] SET RECOVERY Simple 
GO

EXEC SP_FILESTREAM_FORCE_GARBAGE_COLLECTION 

ALTER DATABASE [MyDatabase] REMOVE FILE [MyFile]
GO
ALTER DATABASE [MyDatabase] REMOVE FILEGROUP [MyFileGroup]
GO

ALTER DATABASE [MyDatabase] SET RECOVERY FULL
GO