代码之家  ›  专栏  ›  技术社区  ›  Clinton Pierce

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

  •  0
  • Clinton Pierce  · 技术社区  · 17 年前

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

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

    不想把所有内容都打包在批处理文件中,也不想在服务器本身上做一些其他恶作剧。当我一开始创建混乱时,我想在T-SQL中处理它。我已经浏览了MS Docs,但没有快乐。(请使用SQL Server 2005)

    2 回复  |  直到 17 年前
        1
  •  0
  •   casperOne    17 年前

    您无法直接使用t-SQL来完成此操作。如果T-SQL有办法删除文件系统上的文件,那将是一件非常糟糕的事情。

    这样,SQL Server就可以对CLR存储过程的执行进行沙盒处理,并且还可以控制CLR的内存管理。

        2
  •  0
  •   Oliv    14 年前

    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'
    

    但由于某些错误(可能),即使使用“delfile”选项,sp_dropdevice也不会删除底层文件,也不会报告任何错误。但它可能适用于您的配置。

    推荐文章