簡體   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