繁体   English   中英

使用c#创建SQL Server备份文件(.bak)到任何位置

[英]Creating SQL Server backup file (.bak) with c# to any location

我正在尝试用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”文件夹。 我知道这是一个暂缓问题。 有人可以指向我的资源或在这里写一个简短的片段如何以编程方式将这样的权限添加到我的系统上的任何文件夹。

关心克里斯

我假设您正在运行您的程序作为计划任务...您是否为任务的执行用户提供了目标文件夹的写入权限?

编辑:
有权限,你可以有2个场景:

  • Windows身份验证
  • 混合认证

如果您使用的是Windows身份验证,则会获取Windows用户的读写权限。 否则为sql server服务帐户的权限。

这种行为对我来说很有意义,也许在你的场景中可能会受到影响!

编辑2:
我不想鼓励你这样做......一些管理员可能会恨你,当你搞砸了他的ACL的,但是可能做的伎俩

顺便说一句:Magnus Johansson 已经给你一个“试试这个”链接

无论你采用哪种方法 - 一定要交给正确的用户(如上所述!)

(完整历史)
...
边注:
我知道这不是你问题的确切答案,但我建议你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的。 获取所需服务器版本的程序集(某些参数/属性因服务器版本而异)
更多信息在这里

好伙计们,马格努斯和dittodhole! 非常感谢你的帮助。 我将Magnus'es链接到关于在文件夹上设置permisions的文章以及一些更多的研究,最后我得到了它:)。 所以重新说,我正在使用Smo,并创建一个具有适当权限的文件夹,我必须寻找组而不是win32_Users。 如果有人发现这篇帖子他会发现它很有用,你可以在这里找一个简短的片段:

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岩石!

这是一个用于在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(); 
            } 
      } 
    }

看看这篇文章

请记住为运行SQL Server实例的帐户设置权限。

虽然这可能无法回答您的直接问题,但我建议您研究SQL Server Integration Services(SSIS)。 这看起来就像SSIS的创建一样,在2008版本中,如果需要,可以使用C#代码,如果标准组件不能满足您的需求(早期版本使用VB.NET)。

MSDN SSIS信息链接1
SSIS 2005教程链接2

看看吧。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM