web-dev-qa-db-ja.com

SQL更新取り消し

SQL更新クエリを元に戻す方法はありますか?

19
Balaji

transaction 内で実行しない限り、実行できません。

DBMSトランザクションによって処理が異なるため、ドキュメントをお読みください。たとえば 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をロールバックできるはずです。

最後に、データベースで発生するすべてのことの正確なログを保持している場合は、いつでも更新を元に戻すことができますが、それは別の話です。

18
marcgg

SQL Serverはこれをそのままではサポートしていませんが、トランザクションログを読み取ることでデータを回復できる場合があります。これは、データベースが完全復旧モードで、 ApexSQL Log または Log Rescue などのサードパーティツールが必要な場合に機能します。 DBCC LOGコマンドを使用してt-logを読み取る方法もありますが、多分難しいでしょう。

これが議論されている次のトピックをチェックすることもできます:

SQL Server 2005でUPDATEクエリをロールバックするにはどうすればよいですか?

SQL Server 2008でログファイル(* .LDF)を読み取ります

6
Ken Williams

トランザクション内で更新を実行する場合、トランザクションをロールバックできます。

SQLサーバー:

begin transaction

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

rollback transaction

別の手法としては、テーブルに更新トリガーを追加し、レコードが更新されるたびに、以前の値を「履歴」テーブルに保存する方法があります。このテーブルが頻繁に使用される場合、これは良い考えかもしれませんし、そうでないかもしれません。

5
Andy White

取り消しはSQLではrollbackと呼ばれます。 commitを実行すると、バックアップを復元しない限り、元に戻すことはできません。

ロールバックを実行すると、トランザクション全体が取り消されることに注意してください。つまり、トランザクションが開始されてから(通常、最後のコミットまたはロールバック以降)、すべての更新、挿入、削除が行われます。つまり、2つの連続した更新を行う場合、2番目の更新だけを取り消すことはできません。一部のデータベースは、これを可能にする「セーブポイント」を提供します。

2
Graeme Perrow

(marcggとしての)トランザクションである場合、または最近のバックアップがある場合にのみ...その方法でリカバリすると、「取り消し」という用語がかなり削除されます。

1
lexu

Red Gateの Log Rescue などのサードパーティツールを使用できます。 SQL Toolkitの14日間の無料の機能トライアルがあります。 (SQL Server 2000を想定しています)。

0
AdaTheDev