Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come rimuovere un file di dati da un database di SQL Server (T-SQL)

I database di SQL Server archiviano i propri dati e oggetti in file. Ogni database ha almeno un file di dati (e un file di registro), ma non è limitato a uno solo:potrebbe avere molti file di dati. Se ti trovi mai nella situazione in cui devi rimuovere un file di dati da un database, dovrai prima svuotare quel file, prima di rimuoverlo.

Ma non preoccuparti, lo svuotamento di un file non elimina effettivamente i dati. Migra semplicemente i dati del file in altri file all'interno dello stesso filegroup.

Gli esempi seguenti mostrano come svuotare un file di dati, quindi rimuoverlo dal database utilizzando Transact-SQL.

Esempio rapido

Ecco un rapido esempio per mostrarti come svuotare un file di dati e rimuoverlo dal database:

-- Empty the file
DBCC SHRINKFILE (Solutions2, EMPTYFILE);  
GO 

-- Remove the file
ALTER DATABASE Solutions  
REMOVE FILE Solutions2;  
GO

Quindi, come spiegato, questo svuota il file, quindi lo rimuove completamente dal database. Quando usi EMPTYFILE , questo sposta tutti i dati dal file ad altri file nello stesso filegroup. Pertanto, dovrai assicurarti che questo non sia l'unico file nel filegroup (altrimenti riceverai un errore). EmptyFile ti assicura inoltre che non verranno aggiunti nuovi dati al file.

Un esempio più lungo

Nel caso in cui tu sia confuso dall'esempio precedente, esaminiamo il processo di creazione di un nuovo database, aggiungendo un nuovo file di dati, quindi svuotandolo, quindi rimuovendolo.

Crea un database e visualizza le informazioni sui file di dati

-- Switch to the master database
USE master;
GO

-- Create a new database
CREATE DATABASE Test;
GO

-- View it's data file and log file info
USE Test;  
GO  
SELECT file_id, name, type_desc, physical_name, size, max_size  
FROM sys.database_files ;  
GO

Per prima cosa passiamo al database principale prima di creare un nuovo database chiamato Test . Passiamo quindi al nuovo database e selezioniamo determinate informazioni sui suoi file di database da sys.database_files vista catalogo di sistema.

Aggiungi un nuovo file di dati

-- Add a new data file
ALTER DATABASE Test   
ADD FILE (  
    NAME = Test2,  
    FILENAME = '/var/opt/mssql/data/Test2.mdf',  
    SIZE = 8MB
    );  
GO

-- View it's data file and log file info
USE Test;  
GO  
SELECT file_id, name, type_desc, physical_name, size, max_size  
FROM sys.database_files ;  
GO

Ora aggiungiamo un nuovo file di dati con un nome logico di Test2 e un percorso fisico di /var/opt/mssql/data/Test2.mdf (notare che questo è un percorso Linux/Mac. Se si utilizza Windows, utilizzare barre inverse anziché barre in avanti). Ancora una volta interroghiamo il sys.database_files vista del catalogo di sistema in modo da poter vedere i dettagli del nostro nuovo file.

Svuota il file di dati e rimuovilo

Ai fini di questo esempio, supponiamo che il database sia stato messo in produzione e che il file di dati che abbiamo appena creato sia stato caricato con i dati. Ora vogliamo rimuovere quel file (per qualsiasi motivo). Ma prima di rimuovere il file, dobbiamo svuotarlo (migrare i suoi dati in un altro file).

Ecco come farlo:

-- Empty the new data file
DBCC SHRINKFILE (Test2, EMPTYFILE);  
GO

-- Remove the file
ALTER DATABASE Test  
REMOVE FILE Test2;  
GO 

-- View it's data file and log file info
USE Test;  
GO  
SELECT file_id, name, type_desc, physical_name, size, max_size  
FROM sys.database_files ;  
GO

Quindi questo è proprio come il primo esempio in questa pagina, tranne per il fatto che il nostro database ha un nome diverso. E in questo esempio, interroghiamo sys.database_files per confermare che il file è stato effettivamente eliminato.