2009-04-08 9 views
7

J'essaie d'écrire une application simple en C# qui me permettra de sauvegarder, de compresser et d'envoyer par FTP ma base de données SQL Server. Un problème que j'ai rencontré est que je ne suis pas capable de créer le fichier de sauvegarde (.bak) si j'essaie de le faire dans un emplacement différent de celui de "C: \ Program Files \ Microsoft SQL Server \ MSSQL.3 \ MSSQL \ Sauvegarde "ou" C: \ Program Files \ Microsoft SQL Server \ MSSQL.3 \ MSSQL \ Data "dossier. Je comprends que c'est un problème de prémission. Est-ce que quelqu'un pourrait me diriger vers les ressources ou écrire ici un extrait court comment ajouter par programme une telle permission à n'importe quel dossier sur mon système.Création du fichier de sauvegarde SQL Server (.bak) avec C# à n'importe quel emplacement

Cordialement Kris

Répondre

1

Jetez un oeil à this article. N'oubliez pas de définir les autorisations pour le compte avec lequel l'instance SQL Server est en cours d'exécution.

0

Bien que cela ne puisse pas répondre à votre question immédiate, je vous conseille de regarder dans SQL Server Integration Services (SSIS). Cela ressemble à la chose pour laquelle SSIS a été créé, et dans la version 2008, il est possible d'utiliser du code C# si nécessaire, si les composants standard ne font pas ce dont vous avez besoin (les versions antérieures utilisaient VB.NET).

MSDN SSIS Info Link 1
SSIS 2005 Tutorial Link 2

Jetez un coup d'oeil.

8

Je suppose que vous exécutez votre programme en tant que tâche planifiée ... avez-vous donné des permissions d'écriture au dossier cible pour l'utilisateur de la tâche?

modifier:
avec les autorisations que vous pouvez avoir 2 scénarios:

  • fenêtres authenification
  • d'authentification mixte

si vous utilisez l'authentification Windows, les autorisations de lecture et d'écriture de l'utilisateur Windows est pris. sinon, les autorisations pour le compte de service du serveur SQL. Ce comportement a du sens pour moi et peut-être frapper le clou dans votre scénario!

modifier 2:
je ne veux pas vous encourager à le faire ... certains admins peuvent vous haïr lorsque vous gâcher de leur acl mais this peut faire l'affaire

BTW: Magnus Johansson already gave-vous un "try-ce" lien

peu importe pour quelle méthode vous allez - (! descriped ci-dessus comme) assurez-vous de remettre l'utilisateur correct

(fo r pleine histoire)
...

côté Nota:
Je sais que ce n'est pas la réponse exacte à votre question, mais je vous recommande de SMO pour générer des sauvegardes ...

comme

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 
} 

vous suffit de prendre soin des années .dll. prendre des assemblages pour la version serveur souhaitée (certains params/propriétés varient à travers différentes versions du serveur)
Plus d'infos here

5

Ok les gars, Magnus et dittodhole! Merci beaucoup pour votre aide. J'ai combiné le lien de Magnus à l'article sur la mise en place des permissions sur le dossier avec quelques recherches supplémentaires et enfin je l'ai eu :). Donc, en reprenant, j'utilise Smo, et pour créer un dossier avec les permissions appropriées je dois chercher le groupe au lieu de win32_Users. Ici, vous allez un court extrait si quelqu'un trouve ce poste, il peut le trouver UTILE:

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); 
} 

Encore une fois merci à tous pour votre aide! Roches Stackoverflow!

0

Voici une procédure est l'utilisation pour la sauvegarde en C# .Hope il aide

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(); 
      } 
     } 
    } 
Questions connexes