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中删除条目。