我创建了一个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服务器上创建的备份文件?
答案 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没什么不同。