Sarà necessario un backup completo precedente e tutti i backup dei log eseguiti dall'ultimo backup completo
1) Prendi una coda del backup del registro
BACKUP LOG OldDB TO DISK='C:\OldDB_Tail.trn' WITH NO_TRUNCATE
2) Trova transazione per record eliminati (l'operazione sarà LOP_DELETE_ROWS per DELETEs e LOP_SET_BITS e LOP_MODIFY_ROW per una TABELLA TRUNCATE)
SELECT * FROM fn_dblog(NULL,NULL) WHERE AllocUnitName = 'dbo.YourTableName'
3) Ripristina i backup precedenti completi di dorso e registro più la coda in un nuovo database WITH NORECOVERY e STOPAT = "Poco prima dell'inizio della transazione"
RESTORE DATABASE NewDB
FROM DISK='C:\Previous_Full_Backup_Of_OldDB.bak'
WITH NORECOVERY,
STOPAT='2012/01/11 11:35AM',
MOVE 'OldDB' TO 'C:\DATABASES\NewDB.mdf',
MOVE 'OldDB_Log' TO 'C:\DATABASES\NewDB.ldf'
RESTORE LOG NewDB
FROM DISK='C:\Previous_TranLog_Backup_Of_OldDB.trn'
WITH NORECOVERY,
STOPAT='2012/01/11 11:35AM'
RESTORE LOG NewDB
FROM DISK='C:\OldDB_Tail.trn'
WITH NORECOVERY,
STOPAT='2012/01/11 11:35AM'
-- This recovers the restored database and allows access
RESTORE DATABASE NewDB WITH RECOVERY
Questo post del blog tratta in modo più dettagliato come trovare il tempo di STOPAT usando fn_dblog. Questo post sul blog ha il compito di recuperare i dati direttamente dal registro, ma ciò potrebbe richiedere molto tempo rispetto a un recupero temporizzato.
Anche questo blog post di Robert L Davis ha un esempio sulla combinazione STOP o STANDBY, per consentire all'utente di interrogare lo stato dei database in diversi punti nel tempo.