【问题标题】:Creating SQL Server backup file (.bak) with c# to any location使用 c# 将 SQL Server 备份文件 (.bak) 创建到任何位置
【发布时间】:2010-10-18 05:42:44
【问题描述】:
我正在尝试用 C# 编写简单的应用程序,这将允许我备份、压缩和通过 ftp 发送我的 SQL Server 数据库。
我遇到的一个问题是,如果我尝试在与“C:\Program Files\Microsoft SQL Server\MSSQL.3\MSSQL\Backup”不同的位置创建备份文件 (.bak),我将无法创建它或“C:\Program Files\Microsoft SQL Server\MSSQL.3\MSSQL\Data”文件夹。我知道这是一个前提问题。有人可以指出我的资源或在这里写一个简短的 sn-p 如何以编程方式将这样的权限添加到我系统上的任何文件夹。
问候
克里斯
【问题讨论】:
标签:
c#
sql-server
permissions
backup
【解决方案1】:
这是一个用于在 C# 中备份的过程。希望对您有所帮助
public void BackupDatabase (string BackUpLocation, string BackUpFileName, string
DatabaseName, string ServerName )
{
DatabaseName = "[" + DatabaseName + "]";
string fileUNQ = DateTime.Now.Day.ToString() + "_" + DateTime.Now.Month.ToString() + "_" + DateTime.Now.Year.ToString() +"_"+ DateTime.Now.Hour.ToString()+ DateTime.Now .Minute .ToString () + "_" + DateTime .Now .Second .ToString () ;
BackUpFileName = BackUpFileName + fileUNQ + ".bak";
string SQLBackUp = @"BACKUP DATABASE " + DatabaseName + " TO DISK = N'" + BackUpLocation + @"\" + BackUpFileName + @"'";
string svr = "Server=" + ServerName + ";Database=master;Integrated Security=True";
SqlConnection cnBk = new SqlConnection(svr);
SqlCommand cmdBkUp = new SqlCommand(SQLBackUp, cnBk);
try
{
cnBk.Open();
cmdBkUp.ExecuteNonQuery();
Label1.Text = "Done";
Label2.Text = SQLBackUp + " ######## Server name " + ServerName + " Database " + DatabaseName + " successfully backed up to " + BackUpLocation + @"\" + BackUpFileName + "\n Back Up Date : " + DateTime.Now.ToString();
}
catch (Exception ex)
{
Label1.Text = ex.ToString();
Label2.Text = SQLBackUp + " ######## Server name " + ServerName + " Database " + DatabaseName + " successfully backed up to " + BackUpLocation + @"\" + BackUpFileName + "\n Back Up Date : " + DateTime.Now.ToString();
}
finally
{
if (cnBk.State == ConnectionState.Open)
{
cnBk .Close();
}
}
}
【解决方案2】:
好的,伙计们,马格努斯和混蛋!非常感谢你的帮助。我已经将 Magnus 的链接与关于在文件夹上设置权限的文章结合起来,并进行了一些研究,最后我得到了它:)。
所以重新假设,我正在使用 Smo,并且要创建一个具有适当权限的文件夹,我必须查找该组而不是 win32_Users。如果有人发现这篇文章他会发现它很有用,你可以在这里做一个简短的 sn-p:
string tempPath = Directory.CreateDirectory("C:\\path_to_your_folder").FullName;
//set permissions
SelectQuery sQuery = new SelectQuery("Win32_Group",
"Domain='" +
System.Environment.UserDomainName.ToString() +
"'");
try
{
DirectoryInfo myDirectoryInfo = new DirectoryInfo("C:\\path_to_your_folder");
DirectorySecurity myDirectorySecurity = myDirectoryInfo.GetAccessControl();
ManagementObjectSearcher mSearcher = new ManagementObjectSearcher(sQuery);
foreach (ManagementObject mObject in mSearcher.Get())
{
string User = System.Environment.UserDomainName + "\\" + mObject["Name"];
if(User.StartsWith("your-machine-name\\SQL"))
{
myDirectorySecurity.
AddAccessRule(new FileSystemAccessRule(User,
FileSystemRights.FullControl,
AccessControlType.Allow));
}
}
myDirectoryInfo.SetAccessControl(myDirectorySecurity);
}
catch (Exception ex)
{
Console.WriteLine(ex.StackTrace);
}
再次感谢大家的帮助! Stackoverflow 摇滚!
【解决方案4】:
我假设您将程序作为计划任务运行...您是否为任务的执行用户授予目标文件夹的写入权限??
编辑:
有了权限,您可以有 2 个场景:
如果您使用的是windows认证,则获取windows用户的读写权限。否则是 sql server 服务帐号的权限。
这种行为对我来说很有意义,并且可能会在你的场景中击中钉子!
编辑 2:
我不想鼓励你这样做......当你搞砸他们的 acl 时,一些管理员可能会讨厌你
但是this 可以解决问题
顺便说一句:Magnus Johansson already gave你是一个“试试这个”链接
无论您采用哪种方法 - 请务必提交正确的用户(如上所述!)
(查看完整历史记录)
...
旁注:
我知道这不是您问题的确切答案,但我建议您 smo 生成备份...
喜欢
using Microsoft.SqlServer.Management.Smo;
var bdi = new BackupDeviceItem(/* your path inlcuding desired file */);
var backup = new Backup
{
Database = /* name of the database */,
Initialize = true
};
backup.Devices.Add(bdi);
var server = new Server(this.SqlServer);
try
{
backup.SqlBackup(server);
}
catch (Exception ex)
{
// * log or sth
}
您只需要关心 .dll 文件。获取所需服务器版本的程序集(某些参数/属性因服务器版本而异)
更多信息here