Как отменить выполненный запрос update?
Чаще всего, боржоми уже поздно пить.
Ну можно выяснить, какой режим восстановления установлен
SELECT name,recovery_model_desc FROM sys.databases
и поздравить себя с переходом во вторую категорию из трёх:
1. Люди, которые ещё не делают бэкапы
2. Люди, которые уже делают бэкапы
3. Люди, которые уже проверяют сделанные бэкапы.
А вообще на рабочей базе любой апдейт должен начинаться с BEGIN TRANSACTION
How to undo a SQL Server UPDATE query?
In SQL Server Management Studio, I did the query below.
Unfortunately, I forgot to uncomment the WHERE clause.
1647 rows were updated instead of 4.
How can I undo the last statement?
Unfortunately, I’ve only just finished translating those 1647 rows and was doing final corrections , and thus don’t have a backup .
There is a transaction protocol, at least I hope so.
![]()
![]()
6 Answers 6
A non-committed transaction can be reverted by issuing the command ROLLBACK
But if you are running in auto-commit mode there is nothing you can do.
![]()
If you already have a full backup from your database, fortunately, you have an option in SQL Management Studio. In this case, you can use the following steps:
Right click on database -> Tasks -> Restore -> Database.
In General tab, click on Timeline -> select Specific date and time option.
Move the timeline slider to before update command time -> click OK.
In the destination database name, type a new name.
In the Files tab, check in Reallocate all files to folder and then select a new path to save your recovered database.
In the options tab, check in Overwrite . and remove Take tail-log. check option.
Finally, click on OK and wait until the recovery process is over.
I have used this method myself in an operational database and it was very useful.
![]()
![]()
Considering that you already have a full backup I’d just restore that backup into separate database and migrate the data from there.
If your data has changed after the latest backup then what you recover all data that way but you can try to recover that by reading transaction log.
If your database was in full recovery mode than transaction log has enough details to recover updates to your data after the latest backup.
You might want to try with DBCC LOG, fn_log functions or with third party log reader such as ApexSQL Log
Unfortunately there is no easy way to read transaction log because MS doesn’t provide documentation for this and stores the data in its proprietary format.
How to rollback after wrong update statement in sql server 2008R2? [duplicate]
I have wrongly updated Lastname, City columns in all the rows. Now I want to rollback to the old table rows.
Using SQL-Server 2008R2.
![]()
2 Answers 2
Unless you have some kind of history table & trigger in place, to retain old values at every change, or you made a copy of the table before you ran the update, you will need to use the last backup that was taken before that update. Restore it (as some temp database) and extract the data.
You do have a backup available, right?
BTW, next time you’re doing an update, I suggest you set it up like this:
Run the SELECT first to see exactly which rows will be updated. If needed, adjust the WHERE clause to get the rows you want to target. Only then mark the sentence from the UPDATE till the end and execute it. Much safer then running a «blind» update, as you did, forgetting the WHERE clause (I assume that was the problem).
Even safer — do it on some test database first :).
Как отменить запрос ОБНОВЛЕНИЯ SQL Server?
В SQL Server Management Studio я сделал запрос ниже.
К сожалению забыл раскомментировать WHERE пункт.
Было обновлено 1647 строк вместо 4.
Как я могу отменить последнее утверждение?
К сожалению, я только что закончил перевод этих 1647 строк и делал последние исправления. , и поэтому у вас нет резервной копии .
Есть протокол транзакций, по крайней мере, я на это надеюсь.

Вы когда-нибудь делали резервную копию? Какая у вас модель восстановления? — Martin Smith
О, слава богу, у меня есть автоматическая резервная копия с сегодняшнего дня. — Stefan Steiger
SELECT name,recovery_model_desc FROM sys.databases — Martin Smith
name -> CENSORED, recovery_model_desk -> FULL — Stefan Steiger
Вам также необходимо убедиться, что базы данных нет в auto_truncate режим (не похоже, что будет и хорошо!) SELECT name,recovery_model_desc, CASE WHEN last_log_backup_lsn IS NULL THEN ‘On’ ELSE ‘Off’ END as AutoTruncate FROM sys.databases d join sys.database_recovery_status r ON r.database_id=d.database_id Предполагая, что это так, вы должны уметь использовать свою резервную копию и выполнить восстановление на определенный момент времени (сделайте это как новую базу данных, чтобы быть в безопасности). Подробнее msdn.microsoft.com/en-us/library/ms190982.aspx — Martin Smith
5 ответы
Незафиксированную транзакцию можно отменить, выполнив команду ROLLBACK
Но если вы работаете в режиме автоматической фиксации, вы ничего не можете сделать.
Неправда — восстановление на определенный момент времени может быть доступно через журналы транзакций в зависимости от модели восстановления OP и от того, делали ли они когда-либо резервную копию. — Мартин Смит
Согласен, глядя на комментарии, ОП в любом случае повезло! — Мартин Смит
Если у вас уже есть полная резервная копия из вашей базы данных, к счастью, у вас есть опция в SQL Management Studio. В этом случае вы можете использовать следующие шаги:
Щелкните правой кнопкой мыши базу данных -> Задачи -> Восстановить -> База данных.
На вкладке «Общие» нажмите «Временная шкала» -> выберите параметр «Определенная дата и время».
Переместите ползунок временной шкалы до времени команды обновления -> нажмите «ОК».
В имени целевой базы данных введите новое имя.
На вкладке «Файлы» установите флажок «Перераспределить все файлы в папку», а затем выберите новый путь для сохранения восстановленной базы данных.
На вкладке параметров установите флажок «Перезаписать . » и снимите флажок «Взять хвостовой журнал . ».
Наконец, нажмите ОК и дождитесь завершения процесса восстановления.
Я сам использовал этот метод в оперативной базе данных, и он был очень полезен.
ответ дан 31 дек ’16, 01:12

Учитывая, что у вас уже есть полная резервная копия, я бы просто восстановил эту резервную копию в отдельную базу данных и перенес оттуда данные.
Если ваши данные изменились после последней резервной копии, тогда вы восстанавливаете все данные таким образом, но вы можете попытаться восстановить это, прочитав журнал транзакций.
Если ваша база данных находилась в режиме полного восстановления, то в журнале транзакций достаточно сведений для восстановления обновлений ваших данных после последней резервной копии.
Вы можете попробовать использовать функции DBCC LOG, fn_log или стороннее средство чтения журналов, например Журнал ApexSQL
К сожалению, нет простого способа прочитать журнал транзакций, потому что MS не предоставляет для этого документацию и хранит данные в своем проприетарном формате.
ответ дан 25 апр.
Поскольку у вас есть ПОЛНАЯ резервная копия, вы можете восстановить резервную копию на другой сервер как базу данных с тем же именем или на тот же сервер с другим именем.
Затем вы можете просто просмотреть содержимое перед обновлением и написать сценарий SQL для выполнения обновления.

Я понял, что в этом нет необходимости, я сделал скрипт обновления около 2 часов назад (но не сохранил его и хотел отбросить — к счастью, еще не сделал). Я обновил все значения и с тех пор внес только 4 изменения (которые я помню), поэтому я не потерял более 5 минут работы. Вау, я чертовски удачливый парень . — Стефан Штайгер
Если вы можете это вовремя уловить и у вас нет возможности ROLLBACK или использовать журнал транзакций, вы можете немедленно сделать резервную копию и использовать такой инструмент, как Сравнение данных SQL Redgate создать сценарий для «восстановления» поврежденных данных. Это сработало для меня как шарм. 🙂