A proposito di backup e restore...
Il backup/restore di un db di piccole dimensioni è spesso la strada prescelta per "trasportare" il database da una macchina a un'altra.
Si tratta di una pratica molto usata nei reparti di assistenza software: ci si collega in qualche modo da remoto al server SQL del cliente, si lancia un backup completo del db interessato in un file su disco, e dopo averlo trasportato su una macchina locale, lo si ripristina su un'istanza locale.
Niente di più facile, se non fosse che.. ignorando il fatto che un file di backup è di fatto un "SET" di backup, potrebbe accadere che:
a partire dalla seconda volta che questa operazione viene svolta sullo stesso file di backup, il RESTORE realizza il ripristino del primo dei backup ovvero del più vecchio. Questo a causa del comportamento di default del BACKUP che aggiunge il backup al file, e quello del RESTORE che ripristina il primo backup disponibile.
Quindi, in questi casi sarebbe opportuno realizzare il backup con l'opzione WITH INIT
BACKUP DATABASE MyDB
TO DISK='C:\MyDB.bck'
WITH INIT
In questo modo, tra l'altro, rendo più leggero il file da trasportare, aspetto non trascurabile in una connessione remota. In ogni caso, se dobbiamo ripristinare un db da un backup completo di cui ignoriamo la composizione, possiamo fa uso dell'istruzione RESTORE HEADERONLY
RESTORE HEADERONLY
FROM DISK='C:\MyDB.bck'
dalla quale desumere quanti e quali backup sono contenuti nel file, quindi scegliere il backup di reale interesse utilizzando nella RESTORE DATABASE l'opzione FILE in cui occorre specificare il numero desunto dalla colonna Position restituita dalla RESTORE HEADERONLY.
RESTORE DATABASE MyDB
FROM DISK='C:\MyDB.bck'
WITH FILE=2