Как отменить update sql
Чтобы отменить операцию UPDATE в SQL, необходимо использовать оператор ROLLBACK . ROLLBACK отменяет все изменения, внесенные в базу данных в текущей транзакции.
Если вы только что выполнили операцию UPDATE и еще не закончили транзакцию, вы можете использовать следующую команду:
ROLLBACK;
Эта команда отменит все изменения, внесенные в базу данных в текущей транзакции, включая операцию UPDATE .
Если вы уже закончили транзакцию, чтобы отменить операцию UPDATE , вам нужно восстановить состояние базы данных до момента перед выполнением операции UPDATE . Для этого вы можете использовать резервную копию базы данных или историю изменений, если она ведется. Если вы не имеете резервной копии или истории изменений, отмена операции UPDATE может быть невозможна.
Обратите внимание, что операция ROLLBACK отменяет все изменения в текущей транзакции, а не только операцию UPDATE . Если в транзакции были выполнены другие операции, они также будут отменены.
Как отменить выполненный запрос update?
Чаще всего, боржоми уже поздно пить.
Ну можно выяснить, какой режим восстановления установлен
SELECT name,recovery_model_desc FROM sys.databases
и поздравить себя с переходом во вторую категорию из трёх:
1. Люди, которые ещё не делают бэкапы
2. Люди, которые уже делают бэкапы
3. Люди, которые уже проверяют сделанные бэкапы.
А вообще на рабочей базе любой апдейт должен начинаться с BEGIN TRANSACTION
Ответ написан более двух лет назад
Владимир Коротенко @firedragon
Я снова спрошу как вам поможет транзакция в студии ? То есть сделали запрос, пока висит коннекшкн выбираете данные, если что то неверно делаете ролбэк? Такая логика?
Владимир Коротенко, Ну, примерно да.
Данные можно и не выбирать. По собственному опыту знаю, что ошибку очень часто замечаешь на секунду позже, чем нужно. Здесь rollback и пригодится.
Как-то запустил update, где вообще почему-то. ну не знаю, то ли отвлекло что-то, то ли задумался, вообще не было where. Осознание этого факта пришло прямо в момент запуска запроса. Ощущение было не из приятных. Спасла меня только опечатка в имени таблицы, и вернулась ошибка.
Уроков я вынес несколько.
1. Запрос надо писать, начиная с where
2. Вместо update/delete с тем же where сначала написать select
Владимир Коротенко @firedragon
cicatrix, что кстати мешает держать 2 базы? Продовскую модифицировать только через миграции без рук. А а на стейдже извращаться как хочешь и при необходимости накатывать бэкап?
что кстати мешает держать 2 базы?
Что вам сказать? Лень, излишняя самоуверенность, очень редкие случаи, когда надо что-то сделать через SSMS, жадность.
Ну что мешает всё всегда делать «по фен шую». Реальный мир, наверное.
Команда SQL для удаления и обновление данных в базе (DELETE, UPDATE)
В базу данных можно не только добавлять данные, но и удалять их оттуда. Ещё существует возможность обновить данные в базе. Рассмотрим оба случая.
Удаление данных из базы (DELETE)
Удаление из базы данных происходит с помощью команды «DELETE» (переводится с английского как «УДАЛИТЬ»). Функция удаляет не одну строку, а несколько, при этом выбирает для удаления строки по логике функции «SELECT». То есть чтобы удалить данные из базы, необходимо точно определить их. Приведём пример SQL команды для удаления одной строчки:
DELETE FROM `USERS` WHERE `ID` = 2 LIMIT 1;
Благодаря этому запросу из таблицы «USERS» будет удалена одна запись, у которой в столбце «ID» стоит значение «2».
Обратите внимание, что в конце запроса стоит лимит на выборку «LIMIT 1;» размером в 1 строку. Его можно было не ставить, если поле «ID» является «PRIMARY KEY» (первичный ключ, то есть содержит только уникальные значения). Но всё-таки рекомендуем ставить ограничение «LIMIT 1;» в любом случае, если вы намерены удалить только одну строчку.
Теперь попробуем удалить сразу диапазон данных. Для этого достаточно составить запрос, в результате выполнения которого вернётся несколько строк. Все эти строки будут удалены:
DELETE FROM `USERS` WHERE `ID` >= 5;
Этот запрос удалит все строки в таблицы, у которых в столбце «ID» стоит значение меньше 5. Если не поставить никакого условия «WHERE» и лимита «LIMIT», то будут удалены абсолютно все строки в таблице:
DELETE FROM `USERS`;
На некоторых версиях MySQL способ удаления всех строк через «DELETE FROM _;» может работать медленнее, чем «TRUNCATE _;«; Поэтому для очистки всей таблицы лучше всё-таки использовать «TRUNCATE».
Обновление данных в базе (UPDATE)
Функция обновления «UPDATE» (переводится с английского как «ОБНОВИТЬ») довольно часто используется в проектах сайтов. Как и в случае с функцией «DELETE», фкнция обновления не успокоится до тех пор, пока не обновит все поля, которые подходят под условия, если нет лимита на выборку. Поэтому необходимо задавать однозначные условия, чтобы вместо одной строки нечаянно не обновить половину таблицы. Приведём пример использования команды «UPDATE»:
UPDATE `USERS` SET `NAME` = 'Мышь' WHERE `ID` = 3 LIMIT 1;
В этом примере, в таблие «USERS» будет установлено значение «Мышь» в столбец «NAME» у строки, в столбце «ID» которой стоит значение «3». Можно обновить сразу несколько столбцов у одной записи, передав значения через запятую. Попробуем обновить не только значение с толбце «NAME», но и значение в столбце «FOOD» используя один запрос:
UPDATE `USERS` SET `NAME` = 'Мышь', `FOOD` = 'Сыр' WHERE `ID` = 3 LIMIT 1;
Если не поставить никаких лимитов LIMIT и условий WHERE, то все записи таблицы будут обновлены без исключений.
Восстановление случайно изменённых данных без наличия резервной копии
Сценарий из жизни: вы выполнили инструкцию UPDATE без указания условия WHERE и теперь все ваши данные перезаписаны на некорректные значения. Каким способом теперь вернуть изменённые данные?
Если вы регулярно делаете резервные копии, то восстановить данные не составит проблемы, достаточно выполнить:
- Либо, восстановление из резервной копии, поверх текущей БД
- Либо, если кроме ваших изменений в БД произошли ещё какие-то операции или вы не можете позволить себе временно перевести БД в режим offline:
- Восстановите БД из резервной копии на тестовый сервер
- Выгрузите с помощью SQL Server Management Studio Export data нужные данные
- Загрузите их в вашу исходную БД
Но даже если у вас нет актуальной резервной копии базы данных, вы всё ещё можете вернуть ваши исходные данные, так как все операции UPDATE попадают в журнал транзакций.
Если после изменений журнал транзакций не был усечён (shrunk или truncated), то вы можете воспользоваться программой ApexSQL Log
ApexSQL Log – это как раз тот инструмент, который с помощью журнала транзакций позволит откатить ваше изменение. А дальше вы уже сможете выполнить ваш сценарий обновления, указав нужный фильтр WHERE.
Чтобы с помощью ApexSQL Log вернуть случайно сделанные изменения::
- Запустите ApexSQL Log
- Подключитесь к базе данных
- На шаге Filter setup в разделе Time range укажите диапазон времени, когда произошло изменение (UPDATE)
- Укажите Update row на шаге Filter setup в разделе Operations tab
- Выберите таблицу или таблицы, которые были некорректно изменены (Filter setup ->Tables)
- По возможности, укажите приложение (Applications) из которого произошло изменение и пользователя (Users), который сделал эти изменения
- Нажмите открыть (Open)
- Чтобы создать скрипт отмены (Undo script):
- Нажмите кнопку Create undo script на вкладке Home в группе Actions, для создания сценария отмены всех операций, указанных в таблице
- В контекстном меню Create undo script на таблице со списком транзакций вы можете создать сценарий только для выбранных операций
- Выполните полученный сценарий в вашей БД.
После выполнения сценария все ваши случайно изменённые данные вернутся в исходное состояние.
Теперь, если вы случайно внесли изменения в вашу базу данных, а резервной копии нет в наличии, вы всегда можете воспользоваться приложением ApexSQL Log.
Related posts:
- Чтение журнала транзакций SQL Server
- Восстановление данных из удалённой таблицы без наличия резервной копии
- Восстановление данных SQL Server после случайного удаления (DELETE) или изменения (UPDATE)
- Восстановление удалённых данных из журналов транзакций
- Просмотр содержимого LDF-файла