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

时间:2009-04-08 05:46:11

标签: c# sql-server permissions backup

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

此致 克里斯

5 个答案:

答案 0 :(得分:9)

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

修改
有权限,你可以有2个场景:

  • windows authenification
  • 混合认证

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

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

编辑2:
我不想鼓励你这样做......有些管理员可能会在你弄乱他们的时候讨厌你 但是this可以做到这一点

btw: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

答案 1 :(得分:6)

好的伙计们,马格努斯和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晃动!

答案 2 :(得分:2)

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

答案 3 :(得分:1)

看看this article

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

答案 4 :(得分:0)

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

MSDN SSIS Info Link 1
SSIS 2005 Tutorial Link 2

看看它。