Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 在数据库复制/还原期间删除transact-sql中的备份文件_Database_Sql Server 2005_Tsql_Stored Procedures - Fatal编程技术网

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

Database 在数据库复制/还原期间删除transact-sql中的备份文件,database,sql-server-2005,tsql,stored-procedures,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('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上留下了一个我真的不想要的文件。我怎样才能摆脱它

由于这是一个存储过程,我真的不想把它全部打包到批处理文件或服务器本身的其他hokey文件中。我想在这里从T-SQL开始处理它,当我开始创建混乱时。我浏览了MS文档,但没有乐趣。SQL Server 2005,谢谢


想法?

您不能直接使用t-SQL来实现这一点。如果T-SQL能够删除文件系统上的文件,那将是一件非常糟糕的事情

如果要将其保存在SQL Server中,有两个选项。很可能安装了Microsoft脚本库。您可以使用sp_OA*存储过程创建Scripting.FileSystemObject的实例,然后删除该文件

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

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


通过这种方式,SQL Server可以对CLR存储过程的执行进行沙箱处理,并且还可以控制CLR的内存管理。

我尝试使用以下方法:

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也不会删除底层文件,并且不会报告任何错误。但它可能在您的配置中工作。

xp\u cmdshell也可以。@Joel Coehoorn:是的,它可以,但它遇到了与调用sp\u OA*存储过程相同的安全和资源管理问题。@casperOne:我可能会执行CLR存储过程。@casperOne:不要编辑我的代码。不是你的帖子,不是你的代码,你把最后一行缩进搞糟了。不要插手。@clintp:不是你的位置来表示谁和谁不编辑这篇文章。有关更多详细信息,请参阅常见问题解答。不必在意。这很粗鲁。这是允许的,然后是方式。sp_dropdevice没有遇到错误,以下是MSDN对此的说明:从SQL Server 2005数据库引擎实例中删除数据库设备或备份设备,从master.dbo.sysdevices中删除条目。