让Sql SMO删除数据库备份文件

时间:2013-11-08 20:58:17

标签: c# sql sql-server file delete-file

我创建了一个C#应用程序,允许备份和恢复数据库。它通过首先使用以下命令将数据库备份到Sql服务器上的本地文件来执行此操作:

Backup backup = new Backup();
backup.Devices.AddDevice(Path.GetFullPath(backupFilePath), DeviceType.File);
...
backup.SqlBackup(server);

然后我通过使用以下命令从备份文件恢复来创建新数据库:

Restore restore = new Restore();
restore.Devices.AddDevice(Path.GetFullPath(backupFileToRestoreFrom), DeviceType.File);
...
restore.SqlRestore(server);

创建新数据库后,我想删除我们创建的临时备份文件。因为我在Sql server框上有管理员权限,所以我可以使用以下命令删除远程服务器上的文件:

File.Delete("\\SqlServer\C$\Backups\BackupFileToDelete.bak")

它有效。但是,如果在Sql server框中没有权限的其他人运行应用程序,它将抛出一个关于没有权限的例外。

是否有一个Sql SMO函数,我可以调用它来删除在远程Sql服务器上创建的备份文件?

2 个答案:

答案 0 :(得分:2)

如果使用xp_cmdshell删除文件,则它将使用sql server的权限而不是该人的权限。

例如:

EXEC master..xp_cmdshell 'Del \\SqlServer\C$\Backups\BackupFileToDelete.bak', NO_OUTPUT

以下是xp_cmdshell

的参考资料

该文章需要注意的重要事项是:

  

因为恶意用户有时会尝试提升他们的权限   通过使用xp_cmdshell,默认情况下禁用xp_cmdshell。使用   sp_configure或基于策略的管理以启用它。更多   有关信息,请参阅xp_cmdshell服务器配置选项。

答案 1 :(得分:0)

另一种可能性是使用SQLCLR,这比使用xp_cmdshell更安全。有甚至a CodePlex project call SQLCLR File Functions具有为我编写的存储过程的功能。我想我会看看我是否能说服我们的DBA走这条路。缺点是我相信这个创建的sprocs需要安装在每个创建的现有和新的SQL Server上;与我必须在每台服务器上启用xp_cmdshell没什么不同。