AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi MSSQL DB Restore Problem
Thema durchsuchen
Ansicht
Themen-Optionen

MSSQL DB Restore Problem

Ein Thema von Pet04 · begonnen am 14. Jan 2020 · letzter Beitrag vom 15. Jan 2020
Antwort Antwort
Seite 2 von 2     12   
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#11

AW: MSSQL DB Restore Problem

  Alt 14. Jan 2020, 16:08
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.
Gruß, Jo
  Mit Zitat antworten Zitat
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.211 Beiträge
 
Delphi 11 Alexandria
 
#12

AW: MSSQL DB Restore Problem

  Alt 14. Jan 2020, 21:29
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.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#13

AW: MSSQL DB Restore Problem

  Alt 14. Jan 2020, 21:37
Danke! Manchmal ist man ganz schön vernagelt!

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#14

AW: MSSQL DB Restore Problem

  Alt 15. Jan 2020, 08:05
Moin...
Zitat:
Ich hab kein mssql server, aber wär mir nicht sicher, dass man den DBNAME nicht angeben kann.
...aktuell bin auch dieser Meinung.

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.

Geändert von haentschman (15. Jan 2020 um 08:07 Uhr)
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
972 Beiträge
 
Delphi 6 Professional
 
#15

AW: MSSQL DB Restore Problem

  Alt 15. Jan 2020, 08:40
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...
(Ja ich Verwende Delphi 6 Pro und will NICHT wechseln!)
  Mit Zitat antworten Zitat
Pet04

Registriert seit: 26. Sep 2007
86 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#16

AW: MSSQL DB Restore Problem

  Alt 15. Jan 2020, 08:46
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.
  Mit Zitat antworten Zitat
Pet04

Registriert seit: 26. Sep 2007
86 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#17

AW: MSSQL DB Restore Problem

  Alt 15. Jan 2020, 08:48
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'';';
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#18

AW: MSSQL DB Restore Problem

  Alt 15. Jan 2020, 08:50
Moin...

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. Es muß doch nur der table Name für den Parser in das SQL aufgenommen werden. Dynamisch entweder mit + ( ) oder Format.



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

Geändert von haentschman (15. Jan 2020 um 08:55 Uhr)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#19

AW: MSSQL DB Restore Problem

  Alt 15. Jan 2020, 09:21
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/
Gruß, Jo
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:16 Uhr.
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