2009-04-16 16 views
6

Ho un piccolo database SQL Server che ho bisogno di copiare su comando - Devo essere in grado di prendere i file mfd e ldf in qualsiasi momento, copiarli, comprimerli e renderli disponibili a un utente finale.Dissociare programmaticamente il database di SQL Server per copiare il file mdf

In questo momento questo è possibile grazie manualmente:

1) accedendo al server SQL tramite Remote Desktop

2) Rimozione del database tramite SQL Management Studio. Devo gironzolare con una combinazione di impostazione del database su single_user e/o riavvio del servizio in modo da poterlo staccare dal momento che normalmente il server dell'app è collegato a esso.

3) Durante il distacco, passo attraverso il file system e copia i file mdf e ldf.

4) I ricollegare il database tramite SQL Management Studio

5) I zippare i file copiati, e li mi muovo su un server FTP in modo che le persone che ne hanno bisogno possono ottenere.

È un processo orribile e inefficiente. Non è solo una questione di aver bisogno dello schema, ma piuttosto la necessità per le persone di lavorare con istantanee di dati reali di produzione sulle proprie macchine locali ai fini di una sperimentazione distruttiva. Fortunatamente il database compresso è molto piccolo, forse 30 megs con il log.

Quindi, idealmente, mi piacerebbe creare una pagina nell'applicazione Web ASP .NET con un pulsante che l'utente può premere per avviare la creazione del database corrente in un file zip, quindi fornirei semplicemente il link al download del file.

risposta

9

Perché non fare un backup normale (facile da fare con SqlCommand) e aggiungere una funzionalità per gli utenti di ripristinare facilmente quel file di backup con un clic su un pulsante?

  • È possibile eseguire il backup del database con comandi SQL
  • È possibile sborsare e zip la backupfile con comandi SQL
  • È possibile anche sborsare e ftp il backupfile automagicamente a un server web, se si desidera.

Quali sono gli utenti finali che utilizzano per consumare il tuo db? Un programma di vinificazione? Quindi è facile fare tutto con un clic del pulsante per l'utente.

Ecco alcuni esempi di codice per questo:

Declare @CustomerID int 
declare @FileName nvarchar(40) 
declare @ZipFileName nvarchar(40) 
declare @ZipComand nvarchar(255) 


set @CustomerID=20 --Get from database instead in real life application 
SET @FileName='c:\backups\myback'+ cast(@customerID as nvarchar(10))+'.bak' 
SET @ZipFileName='c:\backups\myback'+ cast(@customerID as nvarchar(10))+'.zip' 

--Backup database northwind 
backup database northwind to [email protected] 

--Zip the file, I got a commanddriven zip.exe from the net somewhere. 
set @ZipComand= 'zip.exe -r '[email protected]+' '[email protected] 
EXEC xp_cmdshell @zipcomand,NO_output 

--Execute the batfile that ftp:s the file to the server 
exec xp_cmdshell 'c:\movetoftp.bat',no_output 

--Done! 

Bisogna avere un movetoftp.bat che contiene questo (ftp server modifica al vostro):
ftp -s: ftpcommands.txt ftp. myftp.net

E devi avere un ftpcommands.txt che contiene questo (si può avere questo file creato dnamically con appena il file zip destra sqlcommands troppo, ma mi consente di farlo da soli):

ftpusername
ftppassword
binario
pronta n
mput. C: \ backup \ * zip
smettere

8

Guardate i dialoghi si utilizza in SQL Management Studio, vicino alla parte superiore di ciascuno è un pulsante che genererà una scrittura per eseguire l'azione. Questo è un modo rapido per scoprire come farlo in SQL, che può essere eseguito da una connessione al database.

E.g. per staccare il database db1:

EXEC master.dbo.sp_detach_db @dbname = N'db1' 
+1

Sottolineando l'esistenza del pulsante di script è stato estremamente utile. +1 –

0

Personalmente vorrei generare backup del database e comprimere quelli e inviarli agli utenti. Forse potresti scrivere un piccolo script da ripristinare.

Il motivo della rimozione del database lo rende non disponibile per gli altri.

0

Vorrei usare la versione di console SQL Dumper e comprimere il dump di sql.

IMHO è sempre meglio avere una copia di testo normale invece di un file binario. Se qualcosa va storto, almeno puoi riscrivere i tuoi dati a mano, perché puoi leggerli.

0

Primo collegamento a SQL Server Senza collegare alcun file DB e senza alcun utilizzo Nome database.

ConnectionString = @"Data Source=XXX;Integrated Security=True;Connect Timeout=30"; 

Nota: XXX =. OR. \ SQLEXPRESS OR. \ MSSQLSERVER O (locale) \ SQLEXPRESS OR (localdb) \ v11.0 & ...

quindi in Query Scollegare il file DB.

"ALTER DATABASE [your DB] SET OFFLINE WITH ROLLBACK IMMEDIATE \n\r exec sp_detach_db @dbname = [your DB]"; 

Ok.

Il mio codice di esempio:

sql_connect1.ConnectionString = @"Data Source=.\sqlexpress;Integrated Security=True;Connect Timeout=30"; 
sql_command.CommandText = "ALTER DATABASE [IRAN] SET OFFLINE WITH ROLLBACK IMMEDIATE \n\r exec sp_detach_db @dbname = [IRAN]"; 
        sql_command.Connection = sql_connect1; 
        sql_connect1.Open(); 
        sql_command.ExecuteNonQuery(); 
        sql_connect1.Close(); 
Problemi correlati