代码之家  ›  专栏  ›  技术社区  ›  James Alexander

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

  •  13
  • James Alexander  · 技术社区  · 16 年前

    对于SQL Server 2008 SP1,我删除了唯一一个与之关联的filestream表,但每次尝试执行以下操作时都会删除:

    更改数据库使用者市场存储删除文件cms_JobInstanceFiles

    更改数据库使用者市场存储删除文件组作业实例文件

    我得到以下例外:

    消息5042,级别16,状态10,第2行 无法删除文件“cms jobinstancefiles”,因为它不是空的。 消息5042,级别16,状态11,第3行 无法删除文件组“JobInstanceFiles”,因为它不是空的。

    我该如何处理文件流文件和文件组?谢谢!

    4 回复  |  直到 8 年前
        1
  •  14
  •   Shawn Melton    10 年前

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

    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文件组设置为空:

    alter table t1 set (filestream_on = "NULL")
    
        2
  •  1
  •   gbn    16 年前

    你必须跑 DBCC SHRINKFILE (CMS_JobInstanceFiles, EMPTYFILE)

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

    当然, ALTER DATABASE 不提这个,但是 DBCC SHRINKFILE 做。。。很明显,嗯?

        3
  •  0
  •   GDP Danny    14 年前

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

    您可以验证 FILESTREAM 通过转到文件流数据容器来清除数据。如果 文件流 数据被删除 ALTER DATABASE dbname REMOVE FILE 通常会成功。一旦完成,你就可以发布 ALTER DATABASE dbname REMOVE FILEGROUP .

        4
  •  0
  •   inam    8 年前

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

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

    我提出的解决方法如下。 我将表1中的所有记录复制到表2中(从表1中选择*复制到表2中)

    然后我删除了表1;之后我可以删除文件组2和 其中的数据文件。

    上次我把表2重命名为表1。

    推荐文章