С SQL Server 2008 SP1 я удалил единственную таблицу, которой связали Filestream с ним, но каждый раз я пытаюсь сделать следующее:
изменитесь база данных ConsumerMarketingStore удаляют файл CMS_JobInstanceFiles
изменитесь база данных ConsumerMarketingStore удаляют группу файлов JobInstanceFiles
Я получаю следующее исключение:
Сообщение 5042, Уровень 16, состояние 10, Строка 2 файл 'CMS_JobInstanceFiles' не может быть удален, потому что это не пусто. Сообщение 5042, Уровень 16, состояние 11, Строка 3 группа файлов 'JobInstanceFiles' не может быть удалена, потому что это не пусто.
Как в мире я избавляюсь от файла Filestream и группы файлов? Спасибо!
Убедитесь, что таблица, которую вы удалили, на самом деле единственная таблица, использующая этот файл 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. Способ избавиться от этого использования - установить файловую группу Filestream таблицы в NULL:
alter table t1 set (filestream_on = "NULL")
Вы должны запустить DBCC SHRINKFILE (CMS_JobInstanceFiles, EMPTYFILE)
Это пометит файл как «пустой» и позволит удалить его.
Конечно, ALTER DATABASE не упоминает об этом, но DBCC SHRINKFILE делает ... очевидным, а?
После удаления таблицы сборщику мусора требуется некоторое время, чтобы очистить данные. Это может быть причиной происходящего. Вы можете принудительно выполнить сборку мусора, выдав CHECKPOINT
.
Вы можете проверить, очищены ли данные FILESTREAM
, зайдя в контейнер данных Filestream. Если данные FILESTREAM
удалены, то ALTER DATABASE dbname REMOVE FILE
обычно приводит к успеху. После этого можно выпустить ALTER DATABASE dbname REMOVE FILEGROUP
.