2009-02-11 9 views
0

J'ai une procédure stockée "copie" pour une base de données. Au cours de la copie, je sauvegarde la base de données avec quelque chose comme:Supprimer le fichier de sauvegarde dans transact-sql lors de la copie/restauration de la base de données

exec('backup database [' + @source + '] ' + 
     'to disk = N''' + @backupdir + '\copybackup'' ' + 
     'with noformat, noinit, name=N''copybackup-full'', ' + 
     'SKIP, NOREWIND, NOUNLOAD, STATS = 10;'); 

Et puis créer et base de données vide, et lui rendre:

exec('create database [' + @dest + '];'); 

exec('restore database [' + @dest + '] ' + 
     'from disk = N''' + @backupdir + '\copybackup'' ' + 
     'with file = 1, ' + 
     'move N''' + @source + ''' to N''' + @dbdir + '\' + @dest + 
       '.mdf'', ' + 
     'move N''' + @source + '_log'' to N''' + @dbdir + '\' + @dest + 
       '_log.ldf'', ' + 
     'NOUNLOAD, REPLACE, STATS = 10;'); 

Donc, tout va bien et bon. Sauf, maintenant je me retrouve avec un fichier sur @backupdir \ copybackup que je ne veux vraiment pas. Comment puis-je m'en débarrasser?

Puisqu'il s'agit d'une procédure stockée, je ne veux pas avoir à tout emballer dans un fichier séquentiel ou quelque chose d'autre sur le serveur lui-même. Je voudrais m'en occuper de T-SQL juste ici quand je crée le désordre en premier lieu. J'ai traversé la MS Docs, mais pas de joie. (SQL Server 2005, s'il vous plaît)

Idées?

+0

@casperOne: Ne pas éditer mon code. Pas votre message, pas votre code, et vous avez foiré la dernière ligne d'indentation de toute façon. Ne touchez pas. –

+0

@clintp: Pas votre place pour indiquer qui et qui ne modifie pas le message. Voir la FAQ pour plus de détails. – casperOne

+0

Ne vous en souciez pas. C'est dur. Il y a des possibilités, et puis il y a des manières. –

Répondre

0

Tu ne vas pas être en mesure d'utiliser directement T-SQL jusqu'à le faire. S'il y avait un moyen pour T-SQL de supprimer des fichiers sur le système de fichiers, ce serait une très mauvaise chose.

Vous avez deux options si vous voulez garder cela dans SQL Server. Plus que probablement, la bibliothèque de script Microsoft est installée. Vous pouvez utiliser les procédures stockées sp_OA * pour créer une instance de Scripting.FileSystemObject, puis supprimer le fichier.

Cependant, cela est une mauvaise idée, car SQL Server ne peut pas vraiment se protéger contre le code malveillant dans ce cas et il ne peut pas dicter la gestion de la mémoire dans le processus serveur soit.

La solution préférée serait de créer une procédure stockée CLR qui prendra le chemin du fichier que vous souhaitez supprimer, puis utiliser les classes dans l'espace de noms System.IO pour supprimer le fichier (en utilisant les classes File ou FileInfo).

De cette façon, SQL Server peut sandbox l'exécution de la procédure stockée CLR, et il a également un contrôle sur la gestion de la mémoire du CLR.

+0

xp_cmdshell le ferait aussi. –

+0

@Joel Coehoorn: Oui, mais il souffre des mêmes problèmes de sécurité et de gestion des ressources que ceux des procédures stockées sp_OA *. – casperOne

+0

@casperOne: Je vais probablement faire la procédure stockée CLR. –

0

J'ai essayé d'utiliser ce qui suit:

exec sp_addumpdevice 'disk', 'temp backup device', 'temp_backup_device.bak' 

BACKUP DATABASE [XXX] TO [temp backup device] WITH NOFORMAT, NOINIT, NAME = N'backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10 

RESTORE DATABASE [bububu] FROM [abcosting temporary backup] WITH FILE = 1, KEEP_REPLICATION, NOUNLOAD, REPLACE, STATS = 10 

exec sp_dropdevice 'temp backup device', 'delfile' 

Mais à cause d'un bug (probablement), l'sp_dropdevice même avec l'option « delfile » ne supprime pas le fichier sous-jacent, et aucune erreur est signalée. Mais cela pourrait fonctionner dans votre configuration.

+0

'sp_dropdevice' ne connaît pas un bug, voici ce que MSDN dit à ce sujet:' crée un dispositif de base de données ou un périphérique de sauvegarde à partir d'une instance du moteur de base de données SQL Server 2005, la suppression de l'entrée de master.dbo.sysdevices.' –

Questions connexes