Отмена 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!).