SQL更新クエリを元に戻す方法はありますか?
6 に答える
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。
最後に、データベースで発生するすべての正確なログを保持していれば、いつでも更新を元に戻すことができますが、それは別の話です。
SQL Server はそのままではこれをサポートしていませんが、トランザクション ログを読み取ることでデータを回復できる場合があります。これは、データベースが完全復旧モードで、ApexSQL LogやLog Rescueなどのサードパーティ ツールが必要な場合に機能します。DBCC LOG コマンドを使用して t-log を読み取る方法もありますが、おそらく難しすぎるでしょう。
これについて説明している次のトピックも確認できます。
トランザクション内で更新を実行する場合は、トランザクションをロールバックできます。
SQLサーバー:
begin transaction
update [Table] set col1 = 'test' where Id = 3
rollback transaction
もう1つの手法は、テーブルに更新トリガーを追加することです。レコードが更新されるたびに、以前の値を「履歴」テーブルに保存します。このテーブルが頻繁に使用される場合、これは良い考えかもしれませんし、そうでないかもしれません。
Undo はrollbackSQL で呼び出されます。いったん実行するcommitと、バックアップを復元しない限り元に戻すことはできません。
ロールバックを実行すると、トランザクション全体が取り消されることに注意してください。つまり、トランザクションが開始されてからのすべての更新、挿入、および削除を意味します。これは通常、最後のコミットまたはロールバック以降です。これは、2 回連続して更新を行った場合、2 回目の更新だけを元に戻すことはできないことを意味します。一部のデータベースは、これを可能にする「セーブポイント」を提供します。
(marcggが言ったように)トランザクションに参加している場合、または最近のバックアップがある場合のみ...その方法で回復すると、「元に戻す」という用語がかなり引っかかります..
Red Gate のLog Rescueなどのサードパーティ ツールを使用できます。SQL Toolkit の 14 日間の無料試用版があります。(SQL Server 2000 を想定しています!)。