2010-02-15 18 views
11

Con SQL Server 2008 SP1, ho rimosso l'unico tavolo che aveva un Filestream ad esso associati, ma ogni volta che tento di fare quanto segue:SQL Server 2008: impossibile rimuovere un file FileStream e Filegroup

alter di database ConsumerMarketingStore rimuovere CMS_JobInstanceFiles di file

ALTER DATABASE ConsumerMarketingStore rimuovere filegroup JobInstanceFiles

ottengo la seguente eccezione:

Msg 5042, livello 16, stato 10, riga 2 Il file 'CMS_JobInstanceFiles' non può essere rimosso perché non è vuoto. messaggio 5042, livello 16, stato 11, riga 3 Il filegroup "JobInstanceFiles" non può essere rimosso perché non è vuoto.

In che modo posso sbarazzarmi del file Filestream e del filegroup? Grazie!

+0

Non dovrebbe essere su ServerFault.com? – mjv

risposta

12

Assicurarsi che il tavolo si caduto è infatti l'unico tavolo che sta usando quel file 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' 

Il risultato della query di cui sopra dovrebbe essere vuoto. Se avevi altre tabelle con colonne Filestream e dici di aver lasciato cadere le colonne, la tabella continuerà a utilizzare il file Filestream. Il modo per sbarazzarsi di questo uso è quello di impostare tabella Filestream filegroup NULL:

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

Sei un uomo fantastico. Dopo giorni di forum di MS, parlando con persone della SM e SO, sei il primo a fornire qualcosa di utile e la risposta. Avevo una tabella che a un certo punto aveva una colonna di file, ma l'ho rimossa. Questo è il motivo per cui mi sono imbattuto in problemi. Grazie mille. –

+0

Esattamente quello di cui avevo bisogno, grazie. – Sam

+0

FWIW, l'ho usato per rimuovere il filestream da tutte le tabelle. Ha generato un errore elencando tutte le tabelle che avevano ancora campi filestream, utile per eliminare i campi di flusso di dati deprecati. –

1

Devi eseguire DBCC SHRINKFILE (CMS_JobInstanceFiles, EMPTYFILE)

questo flag il file come "vuoto" e permettono di essere caduto.

Ovviamente, ALTER DATABASE non lo menziona, ma DBCC SHRINKFILE fa ... ovvio, eh?

+0

In realtà l'ho provato, si ottiene la seguente eccezione: Le proprietà SIZE, MAXSIZE o FILEGROWTH non possono essere specificate per il file di dati FILESTREAM 'CMS_JobInstanceFiles' –

+0

@James Alexander: Quale comando per favore? DBCC o ALTER DATABASE? – gbn

+0

Credo che DBCC SHRINKFILE non funzioni con i file Filestream. –

0

Dopo aver eliminare la tabella, il garbage collector prende un po 'per ripulire i dati. Questa potrebbe essere la ragione per cui ciò accada. È possibile forzare la garbage collection emettendo un numero CHECKPOINT.

È possibile verificare se i dati dello FILESTREAM vengono eliminati dal contenitore dati Filestream. Se i dati FILESTREAM vengono eliminati, in genere si verifica un errore ALTER DATABASE dbname REMOVE FILE. Una volta terminato, è possibile emettere ALTER DATABASE dbname REMOVE FILEGROUP.

+0

Jacob, AFAIK i dati non devono essere raccolti con garbage collection per eliminare il file filestream. Quello che è necessario è che il file non venga usato da nessuna tabella (vedi la mia risposta). Inoltre, nota che CHECKPOINT costringerà GC solo con un semplice modello di recupero e imporrà comunque solo una singola chiamata di GC, che potrebbe non raccogliere tutti i file idonei. –

0

@inam - la mia situazione era un po 'diversa; Ho creato un secondo filegroup e spostato un indice cluster. Successivamente ho eliminato l'indice cluster nel gruppo di file secondario. Dopo che ho provato a cancellare il filegroup, ma ho continuato a ricevere l'errore, il gruppo di file non è vuoto.

Ho visto altri post che indicavano lo spostamento dei dati in un altro file all'interno dello stesso filegroup. Il problema qui era che avevo solo un file nel gruppo di file e volevo eliminare il filegroup e il file in esso.

La soluzione che ho trovato è la seguente. Ho copiato tutti i record da tabella1 in tabella2 (selezionare * in tabella2 da tabella1)

Ho quindi eliminato la tabella1; successivamente sono stato in grado di cancellare il filegroup2 e il file di dati al suo interno.

Last I ha rinominato Table2 in Table1.

Problemi correlati