Создание файла резервной копии SQL Server (.bak) с помощью c # в любом месте - PullRequest
8 голосов
/ 08 апреля 2009

Я пытаюсь написать простое приложение на C #, которое позволит мне делать резервные копии, архивировать и отправлять через ftp мою базу данных SQL Server. Одна проблема, с которой я столкнулся, заключается в том, что я не могу создать файл резервной копии (.bak), если я пытаюсь сделать это в другом месте, чем «C: \ Program Files \ Microsoft SQL Server \ MSSQL.3 \ MSSQL \ Backup» или папку «C: \ Program Files \ Microsoft SQL Server \ MSSQL.3 \ MSSQL \ Data». Я понимаю, что это проблема подачи заявок. Может кто-нибудь указать мне ресурсы или написать здесь небольшой фрагмент, как программно добавить такое разрешение в любую папку в моей системе.

С уважением Kris

Ответы [ 5 ]

9 голосов
/ 08 апреля 2009

я предполагаю, что вы запускаете свою программу как запланированное задание ... дали ли вы права на запись в целевую папку для исполняющего пользователя задания ??

редактирование:
с разрешениями вы можете иметь 2 сценария:

  • Windows аутентификация
  • смешанная аутентификация

если вы используете проверку подлинности Windows, права на чтение и запись для пользователя Windows принимаются. в противном случае разрешения для учетной записи службы сервера sql.

и это поведение имеет смысл для меня и, возможно, поражает вас в вашем сценарии!

изменить 2:
я не хочу призывать вас делать это ... некоторые администраторы могут ненавидеть вас, если вы испортите их списки но это может добиться цели

кстати: Магнус Йоханссон уже дал вам ссылку "попробуй это"

независимо от того, какой метод вы выберете - обязательно укажите правильного пользователя (как описано выше!)

(для полной истории)
...

бок примечание:
я знаю, что это не точный ответ на ваш вопрос, но я бы порекомендовал вам создать резервные копии ...

как

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. принимать сборки для нужной версии сервера (некоторые параметры / свойства различаются в зависимости от версии сервера)
больше информации здесь

6 голосов
/ 09 апреля 2009

Хорошо, ребята, Магнус и яма! Большое спасибо за вашу помощь. Я объединил ссылку Магнуса на статью о настройке разрешений для папки вместе с некоторыми дополнительными исследованиями и, наконец, я понял :). Итак, я предполагаю, что я использую 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 голосов
/ 20 июня 2014

Вот процедура использования для резервного копирования в 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(); 
            } 
      } 
    }
1 голос
/ 08 апреля 2009

Взгляните на эту статью .

Не забудьте установить разрешения для учетной записи, с которой работает экземпляр SQL Server.

0 голосов
/ 08 апреля 2009

Хотя это может не дать ответа на ваш непосредственный вопрос, я бы посоветовал вам изучить службы интеграции с SQL Server (SSIS). Это похоже на то, для чего был создан SSIS, и в версии 2008 года есть возможность использовать код C #, если это необходимо, если стандартные компоненты не выполняют то, что вам нужно (более ранние версии использовали VB.NET).

MSDN SSIS Info Link 1
Ссылка на учебное пособие по SSIS 2005 2

Взгляните на это.

...