2010-02-15 87 views
11

有了SQL Server 2008 SP1,我已删除了与它有关联的文件流的唯一表,但每次我试图做到以下几点:的SQL Server 2008:无法删除一个FileStream文件和文件组

ALTER数据库ConsumerMarketingStore删除文件CMS_JobInstanceFiles

ALTER DATABASE Con​​sumerMarketingStore删除文件组JobInstanceFiles

我得到以下异常:

消息5042,级别16,状态10,2号线 文件'CMS_JobInstanceFiles'不能被删除,因为它不是空的。 消息5042,级别16,状态11,行3 文件组'JobInstanceFiles'不能被删除,因为它不是空的。

如何在世界上摆脱文件流文件和文件组?谢谢!

+0

这不应该在ServerFault.com上? – mjv 2010-02-15 23:33:34

回答

12

确保您删除的表实际上是在目前正使用的是FILESTREAM文件的唯一表:

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文件。为了摆脱这种用法的方式是表的文件​​流文件组设置为NULL:

alter table t1 set (filestream_on = "NULL") 
+0

你是一个了不起的人。经过几天的MS论坛,与MS的人们交谈,所以你是第一个提供有用的东西和答案的人。我有一张表,有一次有一个文件列,但我删除它。这就是为什么我遇到问题。非常感谢。 – 2010-02-16 19:57:41

+0

正是我所需要的,谢谢。 – Sam 2010-03-09 05:56:49

+0

FWIW,我用它从所有表中删除文件流。它列出了一个错误,列出了仍然有文件流字段的表,这对清除废弃的文件流字段非常有用。 – 2014-01-17 17:26:08

1

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

这将标志该文件为“空”,并允许它被丢弃。

当然,ALTER DATABASE不提这个,但DBCC SHRINKFILE确实......明显,呃?

+0

我实际上已经尝试过,你会得到以下例外: 无法为FILESTREAM数据文件'CMS_JobInstanceFiles'指定属性SIZE,MAXSIZE或FILEGROWTH' – 2010-02-16 14:51:31

+0

@James Alexander:请指出哪个命令? DBCC或ALTER DATABASE? – gbn 2010-02-16 18:09:53

+0

我相信DBCC SHRINKFILE不适用于Filestream文件。 – 2010-02-16 18:15:56

0

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

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

+0

Jacob,AFAIK数据不需要被垃圾收集以删除文件流文件。什么是必要的是该文件没有被任何表使用(见我的答复)。 另外,请注意,CHECKPOINT将仅在一个简单的恢复模型下强制执行GC,并且它仍然只会强制执行一次GC调用,而GC可能不会收集所有符合条件的文件。 – 2010-02-17 17:47:24

0

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

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

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

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

最后我把table2改名为table1。