Отмена обновления SQL - PullRequest
       6

Отмена обновления SQL

17 голосов
/ 01 февраля 2010

Есть ли способ отменить запрос на обновление SQL?

Ответы [ 6 ]

17 голосов
/ 01 февраля 2010

Вы не можете, если не запустили его внутри trans action .

В зависимости от вашей СУБД транзакции будут обрабатываться по-разному, поэтому прочтите документацию. Например, с mysql вот как это происходит:

START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A 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.

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

6 голосов
/ 11 марта 2013

SQL Server не поддерживает это из коробки, но в некоторых случаях можно восстановить данные, прочитав журнал транзакций. Это работает, если база данных находилась в режиме полного восстановления и необходимы сторонние инструменты, такие как ApexSQL Log или Log Rescue . Существует также способ прочитать t-log с помощью команды DBCC LOG, но это, вероятно, окажется слишком сложным.

Вы также можете проверить следующие темы, где это обсуждается:

Как откатить запрос ОБНОВЛЕНИЕ в SQL Server 2005?

Чтение файла журнала (* .LDF) в SQL Server 2008

5 голосов
/ 01 февраля 2010

Если вы запускаете обновление внутри транзакции, вы можете откатить транзакцию.

SQL Server:

begin transaction

update [Table] set col1 = 'test' where Id = 3

rollback transaction

Другой способ может состоять в добавлении триггера обновления в таблицуКаждый раз, когда запись обновляется, сохраняйте предыдущие значения в таблицу «истории».Это может или не может быть хорошей идеей, если эта таблица интенсивно используется.

2 голосов
/ 01 февраля 2010

Отмена называется rollback в SQL. После того, как вы сделали commit, вы не сможете отменить его, не занимаясь восстановлением резервных копий.

Обратите внимание, что выполнение отката приведет к отмене всей транзакции, что означает каждое обновление, вставку и удаление с момента начала транзакции, что обычно происходит с момента последнего принятия или отката. Это означает, что если вы делаете два последовательных обновления, вы не можете отменить только второе. Некоторые базы данных предоставляют «точки сохранения», которые позволяют это.

1 голос
/ 01 февраля 2010

Только если вы находитесь в транзакции (как было сказано в marcgg) или если у вас есть недавняя резервная копия ... восстановление таким способом приводит к тому, что термин "отменить" довольно много ...

0 голосов
/ 01 февраля 2010

Вы можете использовать сторонний инструмент, например Red Gate Log Rescue . Существует 14-дневная бесплатная функциональная пробная версия их инструментария SQL. (Предполагается, что SQL Server 2000!).

...