【问题标题】: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 摇滚!

      【讨论】:

        【解决方案3】:

        看看this article

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

        【讨论】:

          【解决方案4】:

          我假设您将程序作为计划任务运行...您是否为任务的执行用户授予目标文件夹的写入权限??

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

          • Windows 身份验证
          • 混合认证

          如果您使用的是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

          【讨论】:

            【解决方案5】:

            虽然这可能无法回答您的直接问题,但我建议您查看 SQL Server Integration Services (SSIS)。这看起来与创建 SSIS 的确切目的完全相同,并且在 2008 版本中,如果标准组件不能满足您的需要(早期版本使用 VB.NET),则可以在需要时使用 C# 代码。

            MSDN SSIS Info Link 1
            SSIS 2005 Tutorial Link 2

            看看吧。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2023-03-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-07-09
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多