Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment supprimer un fichier de données d'une base de données SQL Server (T-SQL)

Les bases de données SQL Server stockent leurs données et objets dans des fichiers. Chaque base de données a au moins un fichier de données (et un fichier journal), mais elle n'est pas limitée à un seul - elle peut avoir plusieurs fichiers de données. Si jamais vous vous trouvez dans une situation où vous devez supprimer un fichier de données d'une base de données, vous devrez d'abord vider ce fichier avant de le supprimer.

Mais ne vous inquiétez pas, vider un fichier ne supprime pas réellement les données. Il migre simplement les données du fichier vers d'autres fichiers du même groupe de fichiers.

Les exemples ci-dessous montrent comment vider un fichier de données, puis le supprimer de la base de données à l'aide de Transact-SQL.

Exemple rapide

Voici un exemple rapide pour vous montrer comment vider un fichier de données et le supprimer de la base :

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

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

Donc, comme expliqué, cela vide le fichier, puis le supprime complètement de la base de données. Lorsque vous utilisez EMPTYFILE , cela déplace toutes les données du fichier vers d'autres fichiers du même groupe de fichiers. Par conséquent, vous devrez vous assurer que ce n'est pas le seul fichier du groupe de fichiers (sinon vous obtiendrez une erreur). EmptyFile vous assure également qu'aucune nouvelle donnée ne sera ajoutée au fichier.

Un exemple plus long

Au cas où vous seriez confus par l'exemple précédent, passons en revue le processus de création d'une nouvelle base de données, en ajoutant un nouveau fichier de données, puis en le vidant, puis en le supprimant.

Créer une base de données et afficher ses informations de fichier de données

-- 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

Nous passons d'abord à la base de données principale avant de créer une nouvelle base de données appelée Test . Nous passons ensuite à la nouvelle base de données et sélectionnons certaines informations sur ses fichiers de base de données dans sys.database_files vue du catalogue système.

Ajouter un nouveau fichier de données

-- 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

Nous ajoutons maintenant un nouveau fichier de données avec un nom logique de Test2 et un chemin physique de /var/opt/mssql/data/Test2.mdf (notez qu'il s'agit d'un chemin Linux/Mac. Si vous utilisez Windows, utilisez des barres obliques inverses au lieu de barres obliques). Encore une fois, nous interrogeons les sys.database_files vue du catalogue système afin que nous puissions voir les détails de notre nouveau fichier.

Videz le fichier de données et supprimez-le

Pour les besoins de cet exemple, supposons que la base de données a été mise en production et que le fichier de données que nous venons de créer a été chargé avec des données. Maintenant, nous voulons supprimer ce fichier (pour une raison quelconque). Mais avant de supprimer le fichier, nous devons le vider (migrer ses données vers un autre fichier).

Voici comment procéder :

-- 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

C'est donc comme le premier exemple sur cette page, sauf que notre base de données a un nom différent. Et dans cet exemple, nous interrogeons sys.database_files pour confirmer que le fichier a bien été supprimé.