Отмена SQL-обновления
Есть ли способ отменить запрос на обновление SQL?
Ответы
Ответ 1
Вы не можете, если вы не запустили его внутри trans action.
В зависимости от вашей СУБД транзакции будут обрабатываться по-разному, поэтому прочитайте документацию. Например, mysql здесь:
START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET [email protected] WHERE type=1;
COMMIT;
С Postresql:
BEGIN;
UPDATE accounts SET balance = balance - 100.00
WHERE name = 'Alice';
-- etc etc
COMMIT;
С TSQL:
DECLARE @TranName VARCHAR(20)
SELECT @TranName = 'MyTransaction'
BEGIN TRANSACTION @TranName
GO
USE pubs
GO
UPDATE roysched
SET royalty = royalty * 1.10
WHERE title_id LIKE 'Pc%'
GO
COMMIT TRANSACTION MyTransaction
GO
Есть также некоторые действия, которые нельзя поместить в транзакцию, но в большинстве систем управления базами данных, которые вы можете найти в эти дни, вы сможете откатить update
.
Наконец, вы всегда можете отменить обновление, если вы сохраняете точный журнал всего, что происходит в базе данных, но это другая история.
Ответ 2
SQL Server не поддерживает это из коробки, но в некоторых случаях можно восстановить данные, прочитав журнал транзакций. Это работает, если база данных находится в режиме полного восстановления и сторонних инструментах, таких как ApexSQL Log или Log Rescue. Существует также способ чтения t-журнала с использованием команды DBCC LOG, но, вероятно, это будет слишком сложно.
Вы также можете просмотреть следующие темы, где это обсуждается:
Как я могу отменить запрос UPDATE на SQL Server 2005?
Прочитайте файл журнала (*.LDF) в SQL Server 2008
Ответ 3
Если вы запустите обновление внутри транзакции, вы можете отменить транзакцию.
SQL Server:
begin transaction
update [Table] set col1 = 'test' where Id = 3
rollback transaction
Другим методом может быть добавление триггера обновления в таблицу, и в любое время, когда запись будет обновлена, сохраните предыдущие значения в таблице "история". Это может быть или не быть хорошей идеей, если эта таблица сильно используется.
Ответ 4
Отменить вызов rollback
в SQL. После того как вы сделали commit
, вы не можете отменить его, не вдаваясь в восстановление резервных копий.
Обратите внимание, что выполнение отката отменяет всю транзакцию, что означает каждое обновление, вставку и удаление с момента начала транзакции, которое обычно происходит с момента последнего фиксации или откат. Это означает, что если вы делаете два последовательных обновления, вы не можете отменить только второй. Некоторые базы данных предоставляют "точки сохранения", которые позволяют это.
Ответ 5
Только если вы находитесь в транзакции (как указано в marcgg), или если у вас есть недавняя резервная копия... восстановление этого способа делает страшный термин "отменить" довольно много.
Ответ 6
Вы можете использовать сторонний инструмент, такой как Red Gate Log Rescue. Существует 14-дневная бесплатная функциональная пробная версия их SQL Toolkit. (Предположим, SQL Server 2000!).