2010-02-15 26 views
11

Với SQL Server 2008 SP1, tôi đã xóa bảng duy nhất có Filestream được liên kết với nó nhưng mỗi lần tôi cố thực hiện như sau:SQL Server 2008: Không thể xóa Tệp Tệp và Tệp Tập tin

thay đổi cơ sở dữ liệu ConsumerMarketingStore loại bỏ CMS_JobInstanceFiles tập tin

cơ sở dữ liệu của alter làm ConsumerMarketingStore loại bỏ filegroup JobInstanceFiles

tôi nhận được ngoại lệ sau đây:

Msg 5042, Level 16, State 10, Line 2 Không thể xóa tệp 'CMS_JobInstanceFiles' vì nó không rỗng. Msg 5042, Cấp 16, Tiểu bang 11, Dòng 3 Không thể xóa tệp nhóm 'JobInstanceFiles' vì nó không trống.

Làm cách nào để xóa tập tin và nhóm tệp Filestream trên thế giới? Cảm ơn!

+0

Điều này có nên ở trên ServerFault.com không? – mjv

Trả lời

12

Hãy chắc chắn rằng bảng bạn giảm là trong thực tế bảng duy nhất đó là sử dụng tập tin 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' 

Kết quả của các truy vấn trên nên trống rỗng. Nếu bạn có các bảng khác có cột Filestream và nói rằng bạn đã bỏ các cột, bảng sẽ vẫn sử dụng tệp Filestream. Cách để loại bỏ việc sử dụng này là đặt nhóm tệp Filestream của bảng thành NULL:

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

Bạn là một người đàn ông tuyệt vời. Sau những ngày diễn đàn MS, nói chuyện với những người ở MS, và SO, bạn là người đầu tiên cung cấp một cái gì đó hữu ích và câu trả lời. Tôi đã có một bảng mà tại một thời điểm đã có một cột tập tin nhưng tôi gỡ bỏ nó. Đó là lý do tại sao tôi gặp phải vấn đề. Cảm ơn bạn rất nhiều. –

+0

Chính xác những gì tôi cần, cảm ơn. – Sam

+0

FWIW, tôi đã sử dụng tính năng này để xóa luồng phim khỏi tất cả các bảng. Nó đã ném một lỗi liệt kê bất kỳ bảng nào vẫn còn có các trường dòng phim, điều này rất hữu ích cho việc xóa các trường dòng phim không dùng nữa. –

1

Bạn phải chạy DBCC SHRINKFILE (CMS_JobInstanceFiles, EMPTYFILE)

Điều này sẽ cờ nội dung tập tin "trống rỗng" và cho phép nó bị phá hủy.

Tất nhiên, ALTER DATABASE không đề cập đến điều này, nhưng DBCC SHRINKFILE không ... hiển nhiên, eh?

+0

Tôi thực sự đã thử điều đó, bạn nhận được ngoại lệ sau: Không thể chỉ định thuộc tính SIZE, MAXSIZE hoặc FILEGROWTH cho tệp dữ liệu FILESTREAM 'CMS_JobInstanceFiles' –

+0

@James Alexander: Bạn cần lệnh nào? DBCC hoặc ALTER DATABASE? – gbn

+0

Tôi tin rằng DBCC SHRINKFILE không hoạt động với các tệp Filestream. –

0

Sau khi bạn thả bảng, trình thu thập rác sẽ mất một lúc để xóa dữ liệu. Đó có thể là lý do cho việc này. Bạn có thể buộc thu gom rác thải bằng cách phát hành CHECKPOINT.

Bạn có thể xác minh xem dữ liệu FILESTREAM có được dọn dẹp hay không bằng cách chuyển đến vùng chứa dữ liệu của luồng trực tuyến. Nếu dữ liệu FILESTREAM bị xóa, ALTER DATABASE dbname REMOVE FILE thường sẽ thành công. Sau khi hoàn tất, bạn có thể phát hành ALTER DATABASE dbname REMOVE FILEGROUP.

+0

Jacob, AFAIK dữ liệu không cần phải thu gom rác để thả tệp tin phim. Điều cần thiết là tập tin không được sử dụng bởi bất kỳ bảng nào (xem trả lời của tôi). Ngoài ra, lưu ý rằng CHECKPOINT sẽ buộc GC chỉ theo một mô hình khôi phục đơn giản và nó sẽ vẫn chỉ buộc một lệnh gọi GC, có thể không thu thập tất cả các tệp đủ điều kiện. –

0

@inam - tình huống của tôi hơi khác một chút; Tôi đã tạo một nhóm tệp thứ hai và di chuyển một chỉ mục nhóm vào nó. Sau đó tôi đã xóa chỉ mục nhóm trong nhóm tệp phụ. Sau đó tôi đã cố gắng để xóa các tập tin nhóm, nhưng tôi tiếp tục nhận được lỗi, nhóm tập tin không có sản phẩm nào.

Tôi thấy một số bài đăng khác được chỉ định để di chuyển dữ liệu sang một tệp khác trong cùng một nhóm tệp. Vấn đề ở đây là tôi chỉ có một tập tin trong nhóm tập tin, và tôi muốn xóa tập tin và tập tin trong đó.

Cách giải quyết mà tôi đưa ra là như sau. Tôi đã sao chép tất cả các bản ghi từ bảng 1 vào bảng 2 (chọn * vào bảng 2 từ bảng 1)

Tôi sau đó đã xóa bảng1; sau đó tôi đã có thể xóa filegroup2 và tập tin dữ liệu trong đó.

Cuối cùng tôi đổi tên bảng 2 thành bảng1.

Các vấn đề liên quan