Database Restore mit Smo



  • Hallo,

    ich habe ein Problem beim Restore von Datenbanken, sobald das Backup an einem anderen Ort als dem Backup-Verzeichnis des SQL-Servers liegt. Da kriege ich einen Error "Betriebssystemfehler 5 (Zugriff verweigert)". Ansonsten funktioniert das Restore wunderbar, wie gesagt solange das Backup im Backup-Verzeichnis liegt. Ich würde es aber gern von überall aus wieder herstellen können.

    Hier meine Funktion, für Hilfe wäre ich dankbar. 🙂

    public bool RestoreFromFile(string serverName, string databaseName, string sBackupFilePath, bool useTrustedConnection, string login, string password)
            {
                // Verbindungsinformationen definieren
                ServerConnection serverConnection = new ServerConnection();
                serverConnection.ServerInstance = serverName;
                if (useTrustedConnection)
                {
                    serverConnection.LoginSecure = true;
                }
                else
                {
                    serverConnection.LoginSecure = false;
                    serverConnection.Login = login;
                    serverConnection.Password = password;
                }
    
                // Verbindung aufbauen
                Server server = new Server(serverConnection);
                try
                {
                    server.ConnectionContext.Connect();
    
                    // Restore aus der angegebenen Datei
                    Restore restore = new Restore();
                    restore.Action = RestoreActionType.Database;
                    restore.Database = databaseName;
    
                    restore.Devices.Add(new BackupDeviceItem(sBackupFilePath, DeviceType.File));
    
                    Database db = server.Databases[databaseName];
                    string DataLogFilePath = server.BackupDirectory.Replace("Backup", "Data\\");
                    String dataFileLocation = DataLogFilePath + databaseName + ".mdf";
                    String logFileLocation = DataLogFilePath + databaseName + "_Log.ldf";
                    db = server.Databases[databaseName];
    
                    DataTable RestoreInfoDT = restore.ReadFileList(server);
                    DataRow drow = RestoreInfoDT.Rows[0];
                    string sOrigDbName = RestoreInfoDT.Rows[0][0].ToString();
    
                    restore.RelocateFiles.Clear();
                    restore.RelocateFiles.Add(new RelocateFile(sOrigDbName, dataFileLocation));
                    restore.RelocateFiles.Add(new RelocateFile(sOrigDbName + "_log", logFileLocation));
                    restore.ReplaceDatabase = true;
    
                    restore.ContinueAfterError = true;
    
                    restore.SqlRestore(server);
    
                    db = server.Databases[databaseName];
    
                    db.SetOnline();
    
                    server.Refresh();
    
                    return true;
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                    return false;
                }
                finally
                {
                    try
                    {
                        // Verbindung zum SQL-Server abbauen
                        server.ConnectionContext.Disconnect();
                    }
                    catch { }
                }
            }
        }
    


  • Das klingt doch eher so dass der User mit dem der SQLServer läuft nicht das Recht hat die Datei zu öffnen oder in das Verzeichnis zu wechseln. Du solltest dann diesem OS-User/Principal die benötigten Rechte geben.



  • Hallo witte,

    danke für die Antwort!
    Aus irgendeinem Grund funktioniert heute das, was am Freitag nicht funktioniert hat. Fehler kommt nicht mehr. Vielleicht musste sich die Anwendung übers Wochenende erst einmal sammeln. 😉
    Soweit so gut, solange der Fehler nicht mehr autritt, ist das Problem gelöst. 🙂


Anmelden zum Antworten