使用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”,因为它不为空。
我如何摆脱文件流文件和文件组?谢谢!
答案 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)
我看到一些其他帖子表示将数据移动到同一文件组中的另一个文件。这里的问题是我在文件组中只有一个文件,我想删除文件组和文件。
我想出的解决方法如下。 我将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