![]() |
AW: MSSQL DB Restore Problem
Also mein erst Versuch wäre jedenfalls mal ordentliche Anführungszeichen, am bsten gleich mit N'' da reinzubauen.
Pfadnamen mit Leerzeichen kommen sicher nicht gut. |
AW: MSSQL DB Restore Problem
Der TE verwechselt dynamisches SQL und Parameter. Parameter können nicht beliebig eingesetzt werden, sondern nur im WHERE als Teil eines Vergleichsausdrucks.
Das SQL Statement für das Restore muss dynamisch zusammengesetzt werden. |
AW: MSSQL DB Restore Problem
Danke! Manchmal ist man ganz schön vernagelt!
Gruß K-H |
AW: MSSQL DB Restore Problem
Moin...8-)
Zitat:
Lösung:
Delphi-Quellcode:
PS: Verabschiede dich vom WITH...das ist mehr zeitgemäß und macht nur Probleme wenn man sie nicht braucht. :wink:
AdoQuery.SQL.Text := Format('restore database %s from ....mit Parameter', [Variable_DBNAME_string])
... |
AW: MSSQL DB Restore Problem
Hmm..
Wie in den vorherigen Threads ja schon geschrieben, musst Du den SQL-Befehl manuell zusammen bauen: (Verkürzt, auf das Wesentliche)
Delphi-Quellcode:
Erläuterung:
ADOQuery.SQL.Text := 'RESTORE DATABASE ' + ATargetDB;
ADOQuery.SQL.Add('FROM DISK = ' + QuotedStr(ASourceFile)); ADOQuery.SQL.Add('WITH '); ADOQuery.SQL.Add('MOVE '+ QuotedStr(ADataBaseLogicalNameMDF) + ' TO '+QuotedStr(ATargetDBPhysicalNameMDF) + ' , '); ADOQuery.SQL.Add('MOVE '+ QuotedStr(ADataBaseLogicalNameLDF) + ' TO '+QuotedStr(ATargetDBPhysicalNameLDF)); ATargetDB -> Datenbankname (z.B. DBName) ASourceFile -> Filename (z.B. E:\Pfad des Backups\db_Name.bak) ADataBaseLogicalNameMDF -> MDF Datenbankname im Backupfile (z.B. DBName) ATargetDBPhysicalNameMDF -> MDF DateiName Ziel (z.B. C:\Program Files\Microsoft SQL Server\MSSQL14.SQLEXPRESS\MSSQL\DATA\db_Name.MDF ) ADataBaseLogicalNameLDF -> LDF Logname im Backupfile (z.B. DBName_LOG) ATargetDBPhysicalNameLDF -> MDF DateiName Ziel (z.B. C:\Program Files\Microsoft SQL Server\MSSQL14.SQLEXPRESS\MSSQL\DATA\db_Name.LDF ) Bedenke aber, dass es hier Fallstricke gibt: 1.) Es können mehr wie ein MDF oder LDF File im Backup enthalten sein, dann benötigst Du für jedes File eine separate 'MOVE ' Zeile. 2.) Der Name des Datenbank-Files 'im' Backup kann sich vom Verwendeten Namen der Datenbank unterscheiden. Somit kann 'ATargetDB' und 'ADataBaseLogicalNameMDF' unterschiedlich sein. Um dies zu Umgehen, musst Du vor dem Zusammenbau deines SQL-Befehls erstmal aus dem Backup-File diese Informationen auslesen. Dies ist nicht ganz trivial und unterscheidet sich bei den verschiedenen Versionen des SQL-Servers geringfügig. Musst Du mal googlen... |
AW: MSSQL DB Restore Problem
Erst einmal vielen Dank für die ganze Unterstützung.
Es funktioniert nun. Ich habe den SQL Befehl nun manuell zusammen gebaut. Dies hatte ich auch als erstes versucht. Hatte halt Fehler mit den Anführungszeichen :wall Im Prinzip habe ich es nun so gelost wie HolgerX es auch geschrieben hat. |
AW: MSSQL DB Restore Problem
Anbei nochmal der Code:
Code:
SQL.text := 'restore database '+ sDBName +
' from disk = ''' + sTemp + ''' with replace, move ''' + sDBName + ''' to ''' + dbPath + sDBName+'.mdf'' , move ''' + sDBName +'_log'' to ''' + dbPath + sDBName + '_log.ldf'';'; |
AW: MSSQL DB Restore Problem
Moin...8-)
Delphi-Quellcode:
...sorry. Aber ohne Parameter geht gar nicht. :evil: Es muß doch nur der table Name für den Parser in das SQL aufgenommen werden. Dynamisch entweder mit + (:kotz: :wink:) oder Format.
ADOQuery.SQL.Text := 'RESTORE DATABASE ' + ATargetDB;
ADOQuery.SQL.Add('FROM DISK = ' + QuotedStr(ASourceFile)); ADOQuery.SQL.Add('WITH '); ADOQuery.SQL.Add('MOVE '+ QuotedStr(ADataBaseLogicalNameMDF) + ' TO '+QuotedStr(ATargetDBPhysicalNameMDF) + ' , '); ADOQuery.SQL.Add('MOVE '+ QuotedStr(ADataBaseLogicalNameLDF) + ' TO '+QuotedStr(ATargetDBPhysicalNameLDF)); :wink: Nachtrag: Zitat:
Code:
...übersichtlich ist was anderes. Auch wenn es so geht. :? Denkst du auch an die die in 3 Monaten den Code in die Finger bekommen und dann :kotz:...:wink:
SQL.text := 'restore database '+ sDBName +
' from disk = ''' + sTemp + ''' with replace, move ''' + sDBName + ''' to ''' + dbPath + sDBName+'.mdf'' , move ''' + sDBName +'_log'' to ''' + dbPath + sDBName + '_log.ldf'';'; |
AW: MSSQL DB Restore Problem
Gut also 'Hübsch' wäre anders und bevor es einem hoch kommt: vor der Kür kommt die Pflicht und da finde ich die Anmerkung von HolgerX wichtiger, als Optik und "Verständnis" (Es ist halt ein Restore, so what):
Anzahl und Inhalt der Backupdateien ist dynamisch! Vielleicht ist so ein Fall nicht relevant im Betrieb dieser Software, aber es sollte dennoch vom TE beachtet werden. In unseren Oracle Systemen bauen wir vergleichbare Statements. Das entscheidende ist dabei, dass alle dazu benötigten, dynamischen Infos über Anzahl und Location der Control Files und Tablespace Files etc aus der DB selbst kommen. Man muss es halt nur abfragen. Dazu eine Funktion die das abfragt und bastelt und der Admin kann nach Herzenslust Tablespaces anlegen. Das ergibt letztlich eine eigene Funktion, die das fertige Statement ausspukt. Wie gesagt, keine Ahnung von MSSQL, aber auf die Schnelle findet man sowas hier z.B.(schon älter, aber es geht erstmal um die Idee): ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz