Newsgroup: it.comp.lang.delphi
Titolo: Delphi fermare mssql per restore database, ho provato... ma...!!!

Salve a tutti, ho scritto una  procedura  per effettuare il restore del
database di cui ho fatto un precedente backup...
In compilazione non ci sono errori. Dopo l'istruzione di commit se chiudo
l'applicazione mi restituisce un errore in cui mi dice che non è stato
possibile
effettuare il restore perchè il db è aperto... allora ho pensato di fare un
batch a parte per il restore ma non non riesco a fermare e a riavviare il
servizio..
ho cercato un po di codice nei post vecchi ma non riesco ad utilizzarlo ve
lo posto :
Se non vado bene per questa strada.. mi date qualche suggerimento?
function TForm.StatoServizio: Boolean;
var
   Machine, Database: PChar;
   SInfo: string;
begin
   Machine:=nil;
   Database:=nil;
   //Apre una connessione al Service Control Manager
   ScmHandle:=OpenSCManager(Machine,Database,SC_MANAGER_CONNECT);
   //Apre una connessione al Servizio 'Nome_Servizo' con i diritti
standard
   SHandle:=OpenService(ScmHandle,'MSSQLServer',SERVICE_ALL_ACCESS);
   //Richiede lo status del Servizio
   QueryServiceStatus(SHandle,SStatus);
   case SStatus.dwCurrentState of
       SERVICE_STOPPED:
       SInfo:='arrestato';
       SERVICE_START_PENDING:
       SInfo:='in fase di partenza';
       SERVICE_STOP_PENDING:
       SInfo:='in fase di arresto';
       SERVICE_RUNNING:
       SInfo:='in esecuzione';
       SERVICE_CONTINUE_PENDING:
       SInfo:='in fase di continuazione';
       SERVICE_PAUSE_PENDING:
       SInfo:='in fase di pausa';
       SERVICE_PAUSED:
       SInfo:='in pausa';
   end;
   //Mostra lo stato corrente
   ShowMessage('Servizio ' + SInfo);
   if SStatus.dwCurrentState = SERVICE_RUNNING then
       Result := True;
   if SStatus.dwCurrentState = SERVICE_STOPPED then
       Result := False;
end;
Procedure TForm.AvviaServizio;
var
  NumberOfArgument: DWORD;
  ServiceArgVectors: PChar;
begin
  NumberOfArgument := 0;
  ServiceArgVectors := '';
  if not StatoServizio then
   WinSvc.StartService(SHandle, NumberOfArgument, ServiceArgVectors);
end;
procedure TDM.ArrestaServizio;
begin
    if StatoServizio then
       //Richiede al Servizio di arrestarsi
       ControlService(SHandle,SERVICE_CONTROL_STOP,SStatus);
   //Rilascia la connessione al Servizio
   if CloseServiceHandle(SHandle) then
       ShowMessage('Chiusura avvenuta');
end;

 servizio..
Non so se stai percorrendo la strada giusta: se blocchi il servizio, poi
l'istruzione di restore chi te la processa?
Comunque, rimango in ascolto perchè interessa molto anche a me!
Saluti
	Marco Bortolani
	info @ 
marcobortolani.it

esclusivo, che non so come ottenere...
Hai provato con sp_dboption?
Dovrebbe essere sp_dboption 'database' , 'single user', 'on'
o qualcosa del genere
-- 
Ore 18.30: premo invio.

lo posto :
Come ti ha fatto notare Marco, fermare il servizio è un nonsense, in
quanto il servizio ti serve per fare il restore.
Prova a guardare la sintassi di sp_dboption
Ciao.


 effettuare il restore perchè il db è aperto... 
se ci pensi è logico: Come si fa a fare il restore di un db in uso?
Inoltre, quella di fermare il servizio è una tecnica da usare per in 
casi di vera emergenza.
Accertati che nessun utente abbia il db aperto e poi procedi.
AS

 sp_dboption 'database' , 'single user', 'on'
Avevo provato con 
	EXEC sp_dboption database, 'dbo use only', true
ma con scarsi risultati: ho provato allora la direttiva che mi hai indicato
tu ma... non ne vuol sapere: "Il database è in uso. Impossibile ottenere
l'accesso esclusivo" + pernacchia
Per adesso ho risolto così: ho insererito la chiamata alla procedura di
backup su file .bak direttamente nella mia applicazione, mentre la gestione
del restore, qualora ce ne sia bisogno, la faccio con il DbaMgr2K del buon
Andrea Montanari (
http://www.asql.biz/DbaMgr.shtm
) al quale SQLServer dà
più retta... 
Però la cosa non è che mi soddisfi pienamente: se qualcuno ha qualche
dritta, la prendo volentieri.



In effetti come dicevo.. mi sono creato un'applicazione a parte proprio per
il restore che chiude il programma principale ( quante volte capitera di
dover fare un restore ) ed ha accesso al db, ma il punto è questo :
Io ho una stored procedure sul server per effetuare il restore... nel
momento in cui volessi utilizzarla devo utilizzare un componente TADODataset
che in ogni modo avrà bisogno di una connessione al db, allora mi chiedo non
mi troverei nella stessa situazione perchè in ogni modo qualcuno userebbe il
DB e non mi farebbe effettuare il restore?
Ciao
Antonio

> Io ho una stored procedure sul server per effetuare il restore... 
anto, scusami, non conosco m$sql, ma...
Il database non può essere il responsabile di un restore, imho.
Se un db fa il restore di se stesso dovrebbe autosovrascriversi.
Se un db fa il restoer di un altro db dovrebbe avere accesso all'altro 
db e non so se m$sql lo permette. Magari l'accesso si ma operazioni di 
manutenzione no?
Dovrebbe esistere un qualcosa che sia un gradino + su del db, e a tale 
entità dovrebbe spettare la responsabilità di eseguire manutenzione sui 
db: back, restore, validazione...
Nel caso di interbase è *il servizio* che fa 'ste cose e non un db in 
particolare.
Possibile che non esista per m$sql un qualcosa tipo gli oggettini 
forniti con d6 per la gestione del server interbase?
Un com? Un tool da riga di comando come gbak di interbase o un app 
windows che accetta parametri?
AS

 AS
Non ne sono sicuro al cento per cento ma l'utility si dovrebbe chiamare
export.exe ma non sono riuscito ad utilizzarla e quindi sono passato al'idea
delle stored procedure inoltre cerco di effettuare il restore in questo modo
perchè ho letto su una pagina web il come fare, la pagina è la seguente :
http://www.visual-basic.it/uploads/articoli/tecnici/scMsde208.htm
ogni idea per me va bene...
una curiosità : ma l'utente non si puo effettuare il restore da solo con
l'enterprise manager?
Ciao,
Antonio.

 info @ 
marcobortolani.it
Visto che ti interessa, io ho risolto, non so se il metodo che ho utilizzato
sia lecito ma funge...
Ho fatto in questo modo...
Mi sono creato un applicazione esterna che tramite stored procedure fa il
detach e l'atach del Db
nel frattempo mi copio i file mdf e log in un 'altra cartella e se devo fare
il restore faccio allo stesso modo
solo che elimino i file nella cartella \mssql\data e vi copio i file di
backup.
PS : l'unico avvertimento è che devono essere chiuse tutte le applicazioni
che usano quel particolare db cosa che non mi riesce ancora.
Cosa ne pensate?
Ciao
Antonio.