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
jobo

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

AW: MSSQL DB Restore Problem

  Alt 14. Jan 2020, 12:40
Das funktionierende Statement müsstest du 1:1 in Deinen Code übernehmen können. - zur Probe
Dann / dort sollte es ebenfalls funktionieren. In der Umgebung, aus der das MM Studio Statement stammt.

Dann muss natürlich die Parameterierung angepasst werden, damit es wieder dynamisch ist.

Ich weiß nicht was ich übersehe oder ob es Dir nicht klar ist. p80286 hat es auch geschrieben.

Was Du aus MM Studio gezeigt hast, ist SQL und SQL führst Du auch in Deinem Client aus.
Wie die Parameter richtig zu befüllen sind (Verzeichnis, Pfadnamen, .. und wie Du sie dynamisch bestimmst, musst Du allerdings selbst wissen.

Analogie:
wenn Du MM Studio hast und damit eine Tabelle abfragst, funktioniert es natürlich. Funktioniert es in Deinem Programm dann nicht, wenn kein MM Studio da ist? Nein, Du kannst die gleiche Abfrage einer Tabelle auch in Deinem Programm laufen lassen.

Ach so: mir fällt gerade ein, dass Du unter MM Studio vielleicht einen anderen User verwendest. Backup / Restore ist ja etwas administratives und der SQL(?) User, den Du im Client verwendest hat dazu vielleicht nicht die Rechte.
Gruß, Jo

Geändert von jobo (14. Jan 2020 um 12:42 Uhr)
  Mit Zitat antworten Zitat
Pet04
Online

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

AW: MSSQL DB Restore Problem

  Alt 14. Jan 2020, 13:30
der erste Code funktioniert ja.
Nun möchte ich ihn mit den Parametern erweitern, woran ich momentan schreitere.

dbPath2 ist die Pfadangabe vom SQL Server 2017

Code:
 with ADOQ1 do
          begin
            dbPath2 := dbPath +sDBName+'.mdf';
            log := dbPath +sDBName+'_log.ldf';
         
            ProgressBar2.Position := 50;
            SQL.clear;        
            SQL.Text := 'restore database :DBName from '
                    //    +'Disk = :BakPfadName with Replace';
                          +'Disk = :BakPfadName WITH FILE = 1, Replace, MOVE :DBName TO :dbPath2, MOVE :logfile TO :log  ';
            Parameters.ParamByName('BakPfadName').Value := sTemp;
            Parameters.ParamByName('DBName').Value := sDBName;
            Parameters.ParamByName('dbPath2').Value := dbPath2;
            Parameters.ParamByName('logfile').Value := sDBName+'_log';
             Parameters.ParamByName('log').Value := log;
            ExecSQL();
Ich glaube, dass hier der Fehler bzw. die Syntax falsch ist.
Code:
 
SQL.Text := 'restore database :DBName from '                  
            +'Disk = :BakPfadName WITH FILE = 1, Replace, MOVE :DBName TO :dbPath2, MOVE :logfile TO :log  ';
  Mit Zitat antworten Zitat
jobo

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

AW: MSSQL DB Restore Problem

  Alt 14. Jan 2020, 14:18
Tja, wie gesagt, Die Kopie Deines Statements oben sollte ja wohl funktionieren.

Dein Versuch sieht anders aus, als das, was angeblich funktioniert. Das war:
Code:
RESTORE DATABASE [db_Name] FILE = N'db_Name'
   FROM DISK = N'E:\Pfad des Backups\db_Name.bak'
   WITH FILE = 1,
   MOVE N'db_Name' TO N'..PathWithFile.mdf',
   MOVE N'db_Name_log' TO N'..PathWithFile.LDF',
   NOUNLOAD,
   REPLACE
Ach und ganz nebenbei: Wieso "glaubst" Du?
Was ist mit Fehlerbehandlung, ErrorCode, ErrorText?
Gruß, Jo
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: MSSQL DB Restore Problem

  Alt 14. Jan 2020, 14:53
Hallo,
"Funktioniert nicht", ist keine Fehlermeldung...

Was klappt konkret nicht, kommt ein SQL-Fehler?

Der müsste auch kommen, weil Parameter nicht für DB-Name (Tabellen usw.) benutzt werden können
(so ist es z.B. bei Firebird).

ein
Delphi-Quellcode:
Select Name From Person
Where PersonenNr=:PersonenNr
ParamByName('PersonenNr').AsInteger:= 1;
klappt

ein
Delphi-Quellcode:
Select Name From :Table
Where PersonenNr=:PersonenNr
ParamByName('Table').AsString:= 'Person'
klappt nicht

Das sollte auch klar ein,
weil ein Prepare der Query (dafür sind die Parameter ja u.a. da)
nicht klappen kann, weil der DB-Server ja gar nicht weiss, mit welcher Tabelle du etwas vorhast.
Heiko

Geändert von hoika (14. Jan 2020 um 14:58 Uhr)
  Mit Zitat antworten Zitat
Pet04
Online

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

AW: MSSQL DB Restore Problem

  Alt 14. Jan 2020, 15:02
Sorry

Die Fehlermeldung lautet:

" Ein Parameterobjekt ist nicht ordnungsgemäß definiert.
Inkonsistente oder unvollständige Informationen wurden eingegeben"

Eine Fehlerbehandlung habe ich auch.
Hatte sie nur nicht mit im Code kopiert.
Code:
 

// Funktionierende Version
try
  with ADOQ1 do
          begin
         
            ProgressBar2.Position := 50;
            SQL.clear;
            SQL.Text := 'restore database :DBName from '
                        +'Disk = :BakPfadName ';              
            Parameters.ParamByName('BakPfadName').Value := sTemp;
            Parameters.ParamByName('DBName').Value := sDBName;
            ExecSQL();
          end; (*with*)        
except
on E:Exception do
messagedlg(E.Message, mtError, [mbok], 0);

Geändert von Pet04 (14. Jan 2020 um 15:05 Uhr)
  Mit Zitat antworten Zitat
jobo

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

AW: MSSQL DB Restore Problem

  Alt 14. Jan 2020, 15:05
Ich hab kein mssql server, aber wär mir nicht sicher, dass man den DBNAME nicht angeben kann.
In einer Query bedeutet eine dynamische Tabelle ja, das jeweils andere Felder und Typen verfügbar wären, deswegen dürfen Tabellennamen wahrscheinlich nicht parametriert werden.

Das ist aber bei diesem Statement nicht so. Es ist ja mehr oder weniger eine Prozeduraufruf mit einer handvoll Parameter (u.a. DBNAME). Keiner dieser Parameter ändert durch einen Wertewechsel die Dynamik des Gesamtstatements.

Vermutlich hat ja sein alter Aufruf mit Param DBName tatsächlich funktioniert. Hier fehlt sicher nur die richtige Aufrufsyntax, ein Komma, ein N'' oder sowas.

Wenn er Fehlerbehandlung einbauen würde, bekäme er es sicher schwarz auf weiß, was hakt.


P.S: roter Balken:
Das ist natürlich die tolle ADO Standardmeldung die gar nichts sagt. Hurra!

Also nimm tatsächlich stückweise die Paramter raus und statt dessen statische Werte, bis Du den Übeltäter hast.
Und natürlich die Syntax aus MM Studio so exakt wie möglich nachbilden.
Gruß, Jo
  Mit Zitat antworten Zitat
jobo

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

AW: MSSQL DB Restore Problem

  Alt 14. Jan 2020, 15: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
Benutzerbild von TigerLilly
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.241 Beiträge
 
Delphi 12 Athens
 
#8

AW: MSSQL DB Restore Problem

  Alt 14. Jan 2020, 20: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 haentschman
haentschman

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

AW: MSSQL DB Restore Problem

  Alt 15. Jan 2020, 07: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 07:07 Uhr)
  Mit Zitat antworten Zitat
HolgerX

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

AW: MSSQL DB Restore Problem

  Alt 15. Jan 2020, 07: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
Antwort Antwort


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 09:53 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