Ответ 1
Да, есть - это журнал транзакций. Чтобы восстановить что-то подобное, до тех пор, пока у вас есть ваша база данных в модели FULL recovery, вы просто сделаете резервную копию журнала транзакций, а затем выполните восстановление с опцией STOPAT, чтобы сообщить, что восстановление прекратит восстановление в точке перед тем, как начать транзакцию. Это вернет базу данных к точке вашей ошибки.
Подробнее об использовании опции STOPAT см. здесь http://msdn.microsoft.com/en-us/library/ms186858(SQL.90).aspx.
Ваш script будет выглядеть примерно так:
-- backup the existing log
BACKUP LOG [MyDatabase]
TO DISK = N'\\MyServer\Share\MyDatabase.trn'
-- options left out for brevity
GO
-- restore the database first
RESTORE DATABASE [MyDatabase]
FROM DISK = N'\\MyServer\Share\MyDatabase.bak'
WITH FILE = 1,
NORECOVERY,
NOUNLOAD,
STATS = 10
GO
/* Previous transaction logs in the chain go here... */
/* restore your log that you backed up after the mistake
took place, stopping at your point where the problem happened */
RESTORE LOG [MyDatabase]
FROM DISK = N'\\MyServer\Share\MyDatabase.trn'
WITH FILE = 1,
NORECOVERY,
NOUNLOAD,
STATS = 10,
STOPAT = '2010-03-12 13:00'
GO