1

我创建了一个允许备份和恢复数据库的 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 服务器上创建的备份文件?

4

2 回答 2

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 服务器配置选项。

于 2013-11-08T21:03:44.673 回答
0

另一种可能性是使用 SQLCLR,它比使用 xp_cmdshell 更安全。甚至还有一个名为 SQLCLR File Functions 的 CodePlex 项目,它具有为我编写为存储过程的功能。我想我会看看我是否能说服我们的 DBA 走这条路。缺点是我认为创建的存储过程需要安装在每个现有的和新创建的 SQL Server 上。我猜这与必须在每台服务器上启用 xp_cmdshell 没有太大区别。

于 2013-11-27T20:33:20.663 回答