Имеет ли SQL Server какую-либо магическую функцию отмены?

Короче говоря, я попытался быстро обновить одну строку на SQL Server с помощью студии Management и просто набрал UPDATE table SET column='value' и забыл часть WHERE other_column='other_value'. Пошел на обед, вернулся, и меня ждут 15 непрочитанных писем. Случилось около часа назад, ожидая, когда парень базы данных вернется, чтобы посмотреть, когда была последняя резервная копия. Там нет волшебной функции UNDO, хотя есть?

Ответ 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

Ответ 3

Он назвал журнал транзакций. Вы можете отбросить его назад. Вы вернули весь журнал в определенный момент времени, а не только свою плохую транзакцию.

Ответ 4

если вы берете резервные копии базы данных и резервные копии журналов транзакций, вы можете сделать точный момент восстановления до момента выполнения инструкции обновления, иначе нет, не действительно

Ответ 5

Я боюсь, что их нет. Вот почему я всегда пишу select, чтобы увидеть результаты, а затем преобразовать их в обновление. Также выучил урок жесткий путь LOL. Конечно, вы можете восстановить из журнала транзакций.