在数据库复制/还原期间删除transact-sql中的备份文件

时间:2009-02-11 21:49:14

标签: database sql-server-2005 tsql stored-procedures

我有一个数据库的“复制”存储过程。在复制期间,我用以下内容备份数据库:

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

然后创建并清空数据库,并恢复到它:

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;');

所以一切都很好。除此之外,现在我在@backupdir \ copybackup中留下了一个我真的不想要的文件。我该如何摆脱它?

由于这是一个存储过程,我真的不希望将它全部包装在批处理文件或服务器本身的其他东西上。当我在第一时间制造混乱时,我想从T-SQL处理它。我已经通过MS Docs了,但没有快乐。 (SQL Server 2005,请)

想法?

2 个答案:

答案 0 :(得分:0)

您无法直接使用T-SQL执行此操作。如果有一种方法让T-SQL删除文件系统上的文件,那将是一件非常糟糕的事情。

如果要在SQL Server中保留此选项,则有两个选项。更有可能的是,安装了Microsoft Scripting Library。您可以使用sp_OA *存储过程创建Scripting.FileSystemObject的实例,然后删除该文件。

然而,这是一个坏主意,因为在这种情况下,SQL Server无法真正保护自己免受恶意代码的攻击,也无法在服务器进程中规定内存管理。

首选解决方案是创建一个CLR存储过程,该过程将获取您要删除的文件的路径,然后使用System.IO命名空间中的类来删除该文件(使用File或FileInfo类)

这样,SQL Server可以沙箱化CLR存储过程的执行,并且还可以控制CLR的内存管理。

答案 1 :(得分:0)

我尝试使用以下内容:

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'

但由于某些错误(可能),sp_dropdevice即使使用' delfile'选项不会删除基础文件,也不会报告错误。但它可能适用于您的配置。