Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi MSSQL DB Restore Problem (https://www.delphipraxis.net/203108-mssql-db-restore-problem.html)

jobo 14. Jan 2020 15:08

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.

TigerLilly 14. Jan 2020 20:29

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.

p80286 14. Jan 2020 20:37

AW: MSSQL DB Restore Problem
 
Danke! Manchmal ist man ganz schön vernagelt!

Gruß
K-H

haentschman 15. Jan 2020 07:05

AW: MSSQL DB Restore Problem
 
Moin...8-)
Zitat:

Ich hab kein mssql server, aber wär mir nicht sicher, dass man den DBNAME nicht angeben kann.
...aktuell bin auch dieser Meinung. :wink:

Lösung:
Delphi-Quellcode:
AdoQuery.SQL.Text := Format('restore database %s from ....mit Parameter', [Variable_DBNAME_string])
...
PS: Verabschiede dich vom WITH...das ist mehr zeitgemäß und macht nur Probleme wenn man sie nicht braucht. :wink:

HolgerX 15. Jan 2020 07:40

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:
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));
Erläuterung:

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...

Pet04 15. Jan 2020 07:46

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.

Pet04 15. Jan 2020 07:48

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'';';

haentschman 15. Jan 2020 07:50

AW: MSSQL DB Restore Problem
 
Moin...8-)

Delphi-Quellcode:
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));
...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.

:wink:

Nachtrag:
Zitat:

Ich habe den SQL Befehl nun manuell zusammen gebaut.
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'';';
...ü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:

jobo 15. Jan 2020 08:21

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):

https://www.mssqltips.com/sqlservert...n-a-directory/


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:07 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz