2009-04-08 14 views
7

Sto provando a scrivere una semplice applicazione in C# che mi consenta di eseguire il backup, zip e inviare su ftp il mio database SQL Server. Un problema che ho riscontrato è che non sono in grado di creare il file di backup (.bak) se provo a farlo in una posizione diversa da "C: \ Programmi \ Microsoft SQL Server \ MSSQL.3 \ MSSQL \ Backup "o" C: \ Programmi \ Microsoft SQL Server \ MSSQL.3 \ MSSQL \ Data ". Capisco che questo è un problema di premessa. Qualcuno potrebbe indicarmi le risorse o scrivere qui un breve snippet come aggiungere a livello di programmazione tale autorizzazione a qualsiasi cartella sul mio sistema.Creazione di file di backup di SQL Server (.bak) con C# in qualsiasi posizione

saluti Kris

risposta

1

Date un'occhiata a this article.

Ricordare di impostare le autorizzazioni per l'account con cui è in esecuzione l'istanza di SQL Server.

0

Anche se questo potrebbe non rispondere alla tua domanda immediata, ti consiglio di esaminare SQL Server Integration Services (SSIS). Questo assomiglia all'esatta cosa per cui SSIS è stato creato, e nella versione 2008 c'è la possibilità di usare il codice C# se necessario, nel caso in cui i componenti standard non facciano ciò che ti serve (versioni precedenti usate VB.NET).

MSDN SSIS Info Link 1
SSIS 2005 Tutorial Link 2

Date un'occhiata a questo.

8

presumo che tu stia eseguendo il tuo programma come operazione programmata ... hai dato permessi di scrittura alla cartella di destinazione per l'utente che esegue l'attività ??

edit:
con i permessi è possibile avere 2 scenari:

  • finestre authenification
  • autentificazione mista

se si utilizza Windows autenticazione, i permessi di lettura e scrittura di l'utente di Windows è preso. altrimenti le autorizzazioni per l'account del servizio SQL Server.

e questo comportamento ha senso per me e forse ha colpito il chiodo nel tuo scenario!

Edit 2:
non voglio incoraggiarvi a farlo ... alcuni amministratori possono odiarti quando si fa confusione del loro ACL ma this può fare il trucco

btw: Magnus Johansson already gave un link

non importa per quale metodo si va "questo try-" - (! come descriped sopra) da essere sicuri di consegnare l'utente corretto

(fo R storia completa)
...

side-nota:
So che questa non è la risposta esatta alla tua domanda, ma vi consiglio di SMO per generare i backup ...

come

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 
} 

hai solo a prendersi cura dei dll di. prendere le assemblee per la versione server desiderato (alcuni params/proprietà variano attraverso le versioni server differenti)
più informazioni here

5

Ok ragazzi, Magnus e dittodhole! Grazie mille per il vostro aiuto. Ho unito il link di Magnus all'articolo sull'impostazione delle permissioni sulla cartella insieme ad altre ricerche e finalmente l'ho ottenuto :). Quindi, riassumendo, sto usando Smo e per creare una cartella con permessi adeguati devo cercare il gruppo invece di win32_Users. Qui si va un breve frammento, se qualcuno trova questo post può trovare utili:

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

Ancora una volta grazie a tutti per il vostro aiuto! Stackoverflow rocks!

0

Ecco una procedura è uso per il backup in C# Speri che aiuta

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